110,499
社区成员
发帖
与我相关
我的任务
分享
public Queue<Action> Procs = new Queue<Action>();
/// <summary>
/// 添加一个任务
/// </summary>
/// <param name="proc"></param>
public void Register(Action proc)
{
Procs.Enqueue(proc);
}
///循环执行任务
public async void LoopProcs()
{
while (true)
{
if (Procs.Count > 0)
{
var handler = Procs.Dequeue();
///这里一个Action执行之后,立刻就执行了下一个Action,我感觉是因为Action是async的缘故,可以应该怎么修改,让它执行完了再执行下一个方法?
handler.DynamicInvoke();
///无可奈何,这里有任务运行就中断循环,然后在执行的方法中,方法结束的时候再调用一次LoopProcs();
return;
}
else
{
await Task.Delay(1000);
}
}
}
/// <summary>
/// 等待浏览器初始化 只能用异步,用同步的话,会卡死UI,我又不想用多线程。
/// </summary>
public void IsBrowserInit()
{
this.Register(() =>
{
this.AddMessage.Invoke(this, new AddMessageEventArgs(FormQidian.ErtboxMsg.添加, "开始运行IsBrowserInit()"));
for (int i = 0; !formCefSharp.IsBrowserInitialized; i++)
{
if (i > 20)
{
this.AddMessage.Invoke(this, new AddMessageEventArgs(FormQidian.ErtboxMsg.添加, "浏览器未初始化,已经等待20秒,中断"));
LoopProcs();
return;
}
this.AddMessage.Invoke(this, new AddMessageEventArgs(FormQidian.ErtboxMsg.添加, "浏览器未初始化,等待1秒,次数:" + i));
Task.Delay(1000);
}
this.AddMessage.Invoke(this, new AddMessageEventArgs(FormQidian.ErtboxMsg.添加, "浏览器初始化完成"));
LoopProcs();
return;
});
/// <summary>
/// 判断是否登陆
/// </summary>
public void IsLogin()
{
this.Register(async () => {
this.AddMessage.Invoke(this, new AddMessageEventArgs(FormQidian.ErtboxMsg.添加, "开始检查登陆状态"));
if (!await formCefSharp.LoginNameAsync())
{
this.AddMessage.Invoke(this, new AddMessageEventArgs(FormQidian.ErtboxMsg.添加, "帐号未登录,中断"));
LoopProcs();
return;
}
else
{
this.AddMessage.Invoke(this, new AddMessageEventArgs(FormQidian.ErtboxMsg.添加, "帐号已登录"));
}
LoopProcs();
return;
});
}
public void IsLogin()
{
this.Register(async () => {
if (!await formCefSharp.LoginNameAsync().GetAwaiter().GetResult())
{
return;
}
return;
});
}
public async Task<bool> LoginNameAsync()
{
for (int i = 1; i < 5; i++)
{
if (UserName == null)
{
webBrowser.GetBrowser().Reload();
//这里卡死,5秒后也不会继续
await Task.Delay(5000);
}
else
{
return true;
}
}
return false;
}
public void IsLogin()
{
this.Register(() => {
if (!formCefSharp.LoginName())
{
return;
}
return;
});
}
public bool LoginName()
{
for (int i = 1; i < 5; i++)
{
if (UserName == null)
{
webBrowser.GetBrowser().Reload();
System.Threading.Thread.Sleep(5000);
}
else
{
return true;
}
}
return false;
}
public async void LoopProcs()
{
while (true)
{
if (Procs.Count > 0)
{
var handler = Procs.Dequeue();
///这里一个Action执行之后,立刻就执行了下一个Action,我感觉是因为Action是async的缘故,可以应该怎么修改,让它执行完了再执行下一个方法?
handler.DynamicInvoke();
return;
}
else
{
await Task.Delay(1000);
}
}
}