首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

我先说说当前的情况吧。
我用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()
但应该还没有什么参考意义:
C# code
?

1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


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.添加, "书架内的书籍全部读取完毕,进行下一步


探索未知领域
返回列表