考虑以下代码:
public Task SomeAsyncMethod()
{
var tcs = new TaskCompletionSource();
... do something, NOT setting the TaskCompletionSource...
return tcs.Task
}
public void Callsite1()
{
await SomeAsyncMethod();
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
public void Callsite2()
{
SomeAsyncMethod().ContinueWith((task) =>
{
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
});
}
在某个时间点,在 SomeAsyncMethod 中创建的 TaskCompletionSource 设置在 ThreadPool 线程上:
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
tcs.SetResult();
当等待来自 TaskCompletionSource 的任务时(如在 Callsite1 中),继续在调用 SetResult 的线程上同步执行。当调用 ContinueWith 时(如在 Callsite2 中),延续在不同的线程上异步执行。
调用配置等待无济于事,如
public void Callsite1()
{
await SomeAsyncMethod().ConfigureAwait(true or false);
}
这甚至不是这个问题的重点。作为 SomeAsyncMethod 的实现者,我不想通过调用 SetResult 来调用一些可能未知的代码。我想让延续总是异步安排。而且我不能依靠调用者来正确配置等待(如果这甚至可以工作的话)。
如何配置 TaskCompletionSource 以使其 Task 在等待时不同步执行其继续?