对象在执行任务时,有新的任务进来,应该怎么设计方法队列
我先说说当前的情况吧。
我用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()
但应该还没有什么参考意义:
我用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.添加, "书架内的书籍全部读取完毕,进行下一步操作");
}
...全文
相关推荐
用golang实现一个定时器任务队列实例
golang中提供了2种定时器timer和ticker,分别是一次性定时器和重复任务定时器。这篇文章主要介绍了用golang实现一个定时器任务队列实例,非常具有实用价值,需要的朋友可以参考下
297_C++_任务队列的添加,汇总类中添加指定任务类的队列,指定任务类中在添加具体执行操作的任务队列,在具体操作队列中再按照对于通道添加通道的执行队列[addTask]
多次细分任务队列的添加,分属不同的功能类去addTask添加到任务队列
JS任务执行顺序[项目源码]
本文详细介绍了JavaScript中的同步任务和异步任务的区别及其执行顺序。同步任务在主线程上顺序执行,而异步任务则存放在任务队列中,只有当主线程的同步任务执行完毕后才会被处理。文章还解释了Promise的执行机制,指出Promise本身是同步的,但其.then()和.catch()方法是异步的。通过多个代码示例,作者展示了同步任务、异步微任务(如Promise.then)和异步宏任务(如setTimeout)的执行顺序,帮助读者更好地理解JavaScript的事件循环机制。
深入多线程之:深入生产者、消费者队列分析
本篇文章是对生产者与消费者队列进行了详细的分析介绍,需要的朋友参考下
PHP实现简单的协程任务调度demo示例
主要介绍了PHP实现简单的协程任务调度demo,结合实例形式详细分析了PHP基于协程的任务调度基本原理、定义及使用技巧,需要的朋友可以参考下


