新方法:实现INFINITE LOOP,可根据要求停止

Meh*_*rad 5 .net c# multithreading asynchronous async-await

实现执行异步 的无限运行任务的正确方法是什么BigJob()?并可根据要求停止

提示:我正在尝试学习[a]新方法来更新我现有的策略.

我有这个简单的程序(测试人员),它有一个开始停止按钮.

当按下Start时,我正在启动测试仪,它将查找并测试范围内的可用设备,并在无限量的轮次中测试我们的地狱,直到用户按下Stop按钮.

重要的是,主进程/ action/bigJob()是和awaitble 异步进程.

所以我会伪装整个事情

Start
  Round 1 starts
    Async Main job starts
       Async connect
       Async Read
       Async Write
       Async disconnect 
    Nobody cancelled me yet
  Round 1 finishes
  Round 2 starts
    .
    .
    .
  Round 2 finishes
  Round 3 starts
    .
    Stop pressed, hence break out. 
Stop
Run Code Online (Sandbox Code Playgroud)

所以我使用BackgroundWorker来实现无限循环,并Async/Await连接,读,写和断开,我已经写在C#下面.Net 4.5

由于我的子任务,如Connect和.etc,async然后我的主要任务是async按下停止按钮停止我的过程,因为它消除了while我拥有的无限循环

while (!bw.CancellationPending)
{
    await MainTask();
    ...
}
Run Code Online (Sandbox Code Playgroud)

但它没有触发BackgroundWorker_RunWorkerCompleted事件,这对我没有任何伤害,但是由于后台工作人员不按预期工作而杀了我,我只是一直在想"应该有更好的方法!".

所以,我一直在阅读有关这么多新想法的内容,比如为什么BackgroundWorker现在使用它们Async/await.有些人说使用Task.Run()它是神奇的.我甚至阅读了关于这个我从未听说过的天赐TPL数据流的推荐和博客.到目前为止,我还没有找到一种结构化,记录和布局的方法BackgroundWorker.(除非它是如此简单或一个甚至不需要文档或.etc的内衬)所以,伙计们,这是什么解决方案.或者更好的方式问:

实现执行异步 的无限运行任务的正确方法是什么BigJob()?并可根据要求停止

SKa*_*all 8

创建CancellationTokenSource并将其Token传递给异步任务.这将允许您向异步任务发出信号,要求取消.更多信息:http://msdn.microsoft.com/en-us/library/hh873177(v = vs1010).aspx


i3a*_*non 8

你应该用CancellationTokenSource.但是不要传递TokenTask.Run方法,也不要抛出异常.只需检查是否要求取消,然后停止.

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;

Task.Run(
    async () =>
    {
        while (!ct.IsCancellationRequested)
        {              
            await ConnectAsync();
            await ReadAsync();
            await WriteAsync();
            await DisconnectAsync();
        }
    });

cts.Cancel();
Run Code Online (Sandbox Code Playgroud)

当您传递CancellationToken给Task本身(Task.Run(async () => ..., ct))时,您不能在委托中使用它.如果在任务开始运行之前调用了取消,它将仅取消该任务.它开始后,呼叫Cancel不会有任何影响.

  • @SKall是什么?哪个功能?连接,阅读等?如果函数是异步的,则一切都应该是异步的.如果他们不是,那就什么都不应该.OP将它们描述为异步. (2认同)