Подумайте об использовании async-await для обработки ввода и обновления результата, пока ваш поток пользовательского интерфейса выполняет другие действия.
Обработчик событий:
private async void OnButton1_clicked(object sender, ...)
{
var result = await ProcessInputAsync(...)
displayResult(result);
}
Предполагая, что ProcessInputAsync является трудоемкой функцией.DisplayResult вызывается потоком пользовательского интерфейса и может обрабатываться нормально.
Примечание: все асинхронные функции должны возвращать Task вместо void или Task <Tresult
> вместо TResult.Есть одно исключение: асинхронные обработчики событий должны возвращать void вместо Task.
private async Task<TResult> ProcessInputAsync(...)
{
return await Task.Run( () => LengthyProcess(...)
}
private TResult LengthyProcess(...)
{
// this is the time consuming process.
// it is called by a non-ui thread
// the ui keeps responsive
TResult x = ...
return x;
}
Если вы действительно не хотите ждать завершения длинного процесса, но хотите, чтобы другой потокпри обновлении пользовательского интерфейса вы получаете ошибку во время выполнения, что поток, который не создал элемент пользовательского интерфейса, пытается его обновить.Для этого у нас есть шаблон вызова:
private void UpdateMyTextBox(string myTxt)
{
if (this.InvokeRequired)
{ // any other thread than the UI thread calls this function
// invoke the UI thread to update my text box
this.Invoke(new MethodInvoker(() => this.UpdateMyTextBox(myTxt));
}
else
{
// if here: this is the UI thread, we can access the my text box
this.TextBox1.Text = myTxt;
}
}