Есть ли способ подождать синхронно для метода async, который работает в одном потоке?Подождите синхронно, чтобы асинхронный метод завершился в той же теме
желаемый эффект
- иметь Worker() выполняются асинхронно на UI потоке
- и в то же время ждать его, чтобы закончить перед метод Close() возвращает
Приведенный ниже пример входит в тупик, и если я создаю async 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);'. Убедитесь, что любая длинная операция, выполняемая в «Рабочем», отменяется через токен. Также уловите 'OperationCanceledException' в рабочем файле и' tcs.SetCanceled() 'в этом случае. – Alex
Что вы на самом деле пытаетесь сделать? Вы сказали, что не работает над попыткой вашего решения, но вы не сказали, в чем проблема, которую вы пытаетесь решить. –
Хотите, чтобы задача продолжалась, или отмените ее в любой точке прерывания, она приостановлена? –