尝试将延续任务封送回原始上下文,则为 true;否则为 false。延续任务指异步(async)方法中await语句之后的代码。
注意: ConfigureAwait(true) 仅在UI程序中有效。
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("main1 thread:" + Thread.CurrentThread.ManagedThreadId);
Task task = TestConfigureAwait();
//等待task执行完成
task.Wait();
Console.WriteLine("main2 thread:" + Thread.CurrentThread.ManagedThreadId);
}
public async Task TestConfigureAwait()
{
await Task.Run(() => {
Thread.Sleep(1000);
Console.WriteLine("Task thread :" + Thread.CurrentThread.ManagedThreadId);
}).ConfigureAwait(true);
//因为上面的任务设置了ConfigureAwait(true),
//所以接下来的代码希望通过UI线程来运行,而UI线程调用了Wait(),造成相交等待,产生死锁。
//注意:ConfigureAwait(true) 在控制台程序中不起作用。
Console.WriteLine("TestConfigureAwait thread : " +
Thread.CurrentThread.ManagedThreadId);
}
}
}
与Awaiter结合使用
ConfiguredTaskAwaitable<int>.ConfiguredTaskAwaiter awaiter = task.ConfigureAwait(true).GetAwaiter();
awaiter.OnCompleted(() =>
{
Console.WriteLine("OnCompleted 线程ID={0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("前驱任务完成时,我就会继续执行");
});