Вы бы пометили свой метод как async
, await
Task.Run
, чтобы продолжения выполнялись на UI , также оставляя только длительный запуск (казалось бы, с привязкой к процессору) задание внутри него
private async void btnAction_Click(object sender, RoutedEventArgs e)
{
btnAction.IsEnabled = false;
txtResult.Text = "";
lblStatus.Text = "Wait...";
string input = query.Text;
// calling a method that takes a long time (>3s) to finish and return
var attempt = await Task.Run(() => someLibrary.doSomethingWith(input));
if (attempt.ContainsKey("success"))
{
if (attempt["success"] == true)
{
txtResult.Text = "Success! The door is: " + (attempt["is_open"] ? "open" : "closed");
lblStatus.Text = "";
}
else
{
lblStatus.Text = "Error! The service says: " + attempt["errorMessage"];
}
}
else
{
MessageBox.Show("There was a problem getting results from web service.");
lblStatus.Text = "";
}
btnAction.IsEnabled = true;
}
Обновление
Чтобы отменить задачу, вы должны использовать CancellationToken
из экземпляра am CancellationTokenSource
и передайте это в Task.Run
, а также в свой долгосрочный метод для проверки на IsCancellationRequested
(если можете). Вы отмените вызов, позвонив по номеру CancellationTokenSource.Cancel
Обратите внимание, что вы, вероятно, захотите заключить его в , попытайтесь поймать наконец и поймать OperationCanceledException
и поместите свой код включения кнопки в наконец