将ParameterizedThreadStart重构为Async Await

时间:2018-06-02 00:11:11

标签: c# async-await

我想重构一些启动新线程以使用async await的代码 代码在队列中执行长时间运行的任务。它是在框架4中,我正在向上移动到4.5.2

这是旧代码

public void Spawn(object data)
{
   var pts = new ParameterizedThreadStart(DoWork);
   new Thread(pts).Start(data);
}
public void DoWork()
{
   // things to run in new thread
}

如何在新线程中运行DoWork?

我试过以下

public async Task DoWork()
{
   // things to run in new thread
}

但是我无法弄清楚如何在Spawn中调用它。 如果我试试

await DoWork()

然后intellisense希望我制作Spawn()Async,所以这开始看起来像一个大的重构。我在正确的道路上吗?

1 个答案:

答案 0 :(得分:1)

如果您只想在后台线程上发生某些事情,最简单的事情就是执行以下操作:

Get-Content 'C:\Users\xyz\Downloads\mylog.log' |
  Select-String 'string\.string1\.string2 - Request:' |
    ForEach-Object { [string]::Join(' ', ([regex]::split($_, '\s+')[1,2,6,7,9,10,12,13])) }

然后您不需要将DoWork功能设置为Task或async。如果你仍然想要等待它的能力,那么你可以等待Task.Run返回的任务,或者调用它上面的Wait()函数(如果你这样做,请注意死锁潜力)。