我的课程有Task<byte[]> DoSmthAsync()
等方法
当我尝试从ViewModel 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;
}
答案 0 :(得分:1)
不,这是正确的方法。您正在从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.
});
}
我希望这会有所帮助。