是否有一種方法可以同步等待在同一個線程上運行的異步方法?等待同步異步方法在同一線程上完成
所需的效果是
- 有工人()異步UI線程
- 上運行,並在同一時間等待它完成關閉()方法返回
下面的例子進入死鎖,如果我使Form1_FormClosing()異步我不滿足第二個條件。
public partial class Form1 : Form
{
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
CancellationTokenSource cts = new CancellationTokenSource();
public Form1()
{
InitializeComponent();
Show();
Worker(cts.Token); // async worker started on UI thread
}
async void Worker(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
await TaskEx.Delay(1000);
tcs.SetResult(true); // signal completition
}
private void button1_Click(object sender, EventArgs e)
{
Close();
MessageBox.Show("This is supposed to be second");
}
private async void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
cts.Cancel(); // request cancel
tcs.Task.Wait(); // deadlock
await tcs.Task; // button1_Click() gets control back instead of Worker()
MessageBox.Show("This is supposed to be first");
}
}
使用'await Task.Delay(1000,ct).ConfigureAwait(false)'。和'tcs.TrySetResult(true);'。確保'Worker'中執行的任何長操作都可以通過令牌取消。在這種情況下,還要在worker中捕獲'OperationCanceledException',並且'tcs.SetCanceled()'。 – Alex 2015-04-05 02:17:43
你究竟在做什麼?你已經說過什麼對你的解決方案沒有幫助,但是你沒有說明你想要解決的問題。 – 2015-04-05 02:34:47
您是否想讓任務繼續運行,或者在任何中斷點取消它? – 2015-04-05 03:19:20