常量循环 - 线程与异步,最佳实践

Zho*_*len 0 c# task-parallel-library async-await

我有一些常见的代码,在我们的一些内部应用程序中,我似乎经常使用它.

public State SomeState { get; set; }
Thread thread = new Thread(ThreadProc)
thread.Start();

void ThreadProc() {
    while(isTrue){
       //Changes SomeState after ping
       //Can take up to 5 seconds to complete if service is unavailable
       PingServiceTocheckState(); 
       UpdateUI();
       Thread.Sleep(200);
    }
}

void UpdateUI() {

    if (InvokeRequired)
    {
        Invoke(new MethodInvoker(UpdateUI));
        return;
    }

    if(SomeState == State.Up){
        //set these UI values (txt.Text = ...)
    }
    ......
}
Run Code Online (Sandbox Code Playgroud)

并且常量操作可以是在窗体上更新UI或者不断地从网络流中读取.

我觉得与TPL和Async相比,这可能已经过时了.

我是否认为使用Async/TPL可以更好地管理它?如果是这样,有人能举例说明我将如何利用这些新想法完成上述工作吗?

*注意:我目前偶尔会使用异步,我试图让它在我的编码中更流行,但我在使用异步创建一个长期运行的"后台线程"的最佳方法上有点迷失.

编辑:

我已经更新了我的示例,其中包含了与我当前项目相关的更多细节.我在UserControl中有类似的代码.然后我有一个Windows窗体,动态添加约50个这些控件.如果没有Thread,表单基本上会挂起,线程一切都运行顺畅.我只想到,而不是自己管理线程async/TPL会比我自己更有效地管理任务(Ping和Update).

Mar*_*ell 5

TPL非常适合持续时间较短的任务 - 因为您基本上是在使用池中的工作人员.如果您的操作是连续的,则专用线程是完全合适的.但是,如果PerformAction实际上阻​​塞等待进入队列的数据,并且实际上只是非常短暂地偶尔做任何事情,那么是:TPL可能会重新发挥作用.但是有一个顺序与并发编程的问题:目前,在那种情况下,你将按顺序处理事物.TPL没有这样的保证,并且旨在同时处理事情.当然可以编写使用 TPL(或只是regrular ThreadPool)来处理顺序队列的代码,但它有点复杂,并且围绕着"是否存在当前工作者"存在边缘情况和线程争用"我需要开始吗?是吗?" 的问题.