对象在执行任务时,有新的任务进来,应该怎么设计方法队列

张天星 2019-02-04 06:07:06
我先说说当前的情况吧。
我用CefSharp做一些事情。
首先,运行的时候需要初始化,我需要观察浏览器初始化成功。
然后初始化成功之后,需要做其他任务,比如登陆。
这两步的顺序是固定的,但时间不一定,因为收到浏览器加载速度的影响。
登陆成功之后,
可能需要进入某个网址,
可能需要下载文本,
不同的网址执行的内容还不一样。
我将这些执行的内容,都写成了方法:
IsLogin() //判断是否登陆成功
LoadUrl(string url)//进入某个网址
GetBookcase(string html)//分析网页内的链接

现在我是一个写死的按钮,在点击自动运行之后,程序会判断登陆、进入指定网址(写死的)、进入网页内的链接。
太死板了。
我现在想要换成一直类似消息队列的方式。
我希望的是,CefSharp现在还在IsLogin().
这时候,我可以调用LoadUrl(www.baidu.com).
再调用GetBookcase(string html,Type type)执行指定的内容。
然后在调用LoadUrl(xxx)其他网址。
大概意思就是,按顺序调用不同的方法。
程序在执行其他任务没关系,记录下来,一步一步的去运行。
。。。。
我现在大概的思路是,写一个全局的List<string> tasks列表,将要执行的命令放到这里面去。
然后每个任务执行完成之后,都去这个tasks里面去获取文本,通过文本分析下一步要执行的内容。
但感觉怪怪的,这个分析文本有问题啊。
有没有办法做一个方法的列表,然后我执行完一个方法之后去执行下一个方法?
而这个方法的列表可以随时添加?

//刚才突然想到,将这个List<string>改成了Dictionary<string,object> tasks
其中,string是要执行的方法,obj是这个方法的参数。。
正在修改中,但还是感觉怪怪的。
这个string,有没有办法直接传入方法?
甚至连object都不要,直接List<带参数的方法>




我这个项目的地址是:https://gitee.com/zzwtx/FictionsDownload.git
我所说的内容在FictionsDownload.UI.FormQidian.AutoWeb()
但应该还没有什么参考意义:
public async void AutoWeb()
{
int i = 1;
while (!formCefSharp.IsBrowserInitialized)
{
if (i > 5)
{
SetRtboxMsg(ErtboxMsg.添加, "浏览器未初始化,已经等待5次,中断");
return;
}
SetRtboxMsg(ErtboxMsg.添加, "浏览器未初始化,等待5秒,次数:" + i);
await Task.Delay(5000);
i++;
}
SetRtboxMsg(ErtboxMsg.添加, "开始检查登陆状态");
if (!await formCefSharp.LoginName())
{
SetRtboxMsg(ErtboxMsg.添加, "帐号未登录,中断");
return;
}
else
{
SetRtboxMsg(ErtboxMsg.添加, "帐号已登录,开始进入书架");
}
if(!await formCefSharp.LoadUrl("https://my.qidian.com/bookcase"))
{
SetRtboxMsg(ErtboxMsg.添加, "进入书架失败,中断");
return;
}
else
{
SetRtboxMsg(ErtboxMsg.添加, "进入书架成功,开始读取书架链接");
}
Dictionary<string, string> bookcases = formCefSharp.GetBookcase(rtbox_Html.Text);
bookcases.Add("", "默认分组");
SetRtboxMsg(ErtboxMsg.添加, "书架表读取成功,将书架写入数据库");
var folders = BookCaseToDB(bookcases);
lvBookcaseRefresh(bookcases);
SetRtboxMsg(ErtboxMsg.添加, "书架表读取成功,读取书架内的书籍");
foreach (var folder in folders)
{
Dictionary<string, string> books = await formCefSharp.GetBooks(folder.Remarks);
if (books == null)
{
SetRtboxMsg(ErtboxMsg.添加, "读取书架:" + folder.Name + "时返回空值,中断");
return;
}
else
{
SetRtboxMsg(ErtboxMsg.添加, "读取书架:" + folder.Name + "的内容读取成功,共计:"+books.Count+"本,写入数据库");
BooksToDB(books,folder.Id);
lvBookcaseRefresh(books);
}
}
SetRtboxMsg(ErtboxMsg.添加, "书架内的书籍全部读取完毕,进行下一步操作");
}
...全文
254 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
张天星 2019-02-05
  • 打赏
  • 举报
回复
我找到了Queue<Action>,好像可以解决问题
张天星 2019-02-04
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
我很佩服你的钻研精神,只可惜你并不知道 http 协议是什么?如何工作的

额,感觉和HTTP协议没有关系吧。
如果有其他地方,需要用到这种任务队列的。
一个任务执行完之后去获取下一个任务执行,
任务队列随时添加,应该也有类似的设计吧。。
总感觉我应该多少听过类似的设计思路,可惜没有实践过,真的要上手了,有点麻爪。
xuzuning 2019-02-04
  • 打赏
  • 举报
回复
我很佩服你的钻研精神,只可惜你并不知道 http 协议是什么?如何工作的

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧