在 .net 4.0 中启动任务的正确方法

本文关键字:方法 任务 启动 net | 更新日期: 2023-09-27 17:57:24

>我有一个类,其中包含Task<byte[]> DoSmthAsync()当我尝试从视图模型 ICommand void 方法启动此任务时,它会同步启动

void DoSomeCommand()
{
  //log managed thread id ...
  _someClass.DoSmthAsync().ContinueWith(resultTask => ...);
}

如果我在任务外部和内部记录 CurrentThread.ManagedThreadId 它看起来是一样的

Thread #9 - outside
Thread #9 - inside task
Thread #4 - inside inside task // does not matter
Thread #9 - continuation

为了以异步方式启动此任务,我被迫使用() => _someClass.DoSmthAsync().ContinueWith(resultTask => ...)操作创建新任务并为此调用Start(),但我认为这是错误的方法。

我使用 .NET 4.0 并且无法使用 async-await,顺便说一句,我从未遇到过这样的问题。

内部任务是使用 TaskCompletionSource 创建的:

public Task<byte[]> ProcessDataFromPortAsync(byte[] outData)
{
  var tcs = new TaskCompletionSource<byte[]>();
  // some event handling  ... 
  WritePortData(outData);
  return tcs.Task;
}

在 .net 4.0 中启动任务的正确方法

不,这是正确的方法。您正在从 DoSmthAsync() 方法返回任务,如果您遵循 TPL 准则,则必须在异步方法中启动

private Task<byte[]> DoSmthAsync()
{
    return Task.Factory.StartNew<byte[]>(() => 
        {
            // Some stuff.
        });
}

然后可以在另一种方法中使用

private void Method()
{
    Task<byte[]> task = DoSmthAsync().ContinueWith(ant => 
        {
            // Some other stuff.
        });
}

我希望这有所帮助。