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