async
和 await
是 C# 中用于异步编程的关键字。它们允许你在不阻塞主线程的情况下执行长时间运行的操作,从而提高应用程序的响应性和性能。
Task
或 Task<T>
对象。async
方法内部使用。async
和 await
可以使异步代码看起来像同步代码,从而提高代码的可读性和可维护性。在搜索函数中使用 async
和 await
的典型场景包括:
以下是一个在搜索函数中使用 async
和 await
的示例:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private async void SearchButton_Click(object sender, EventArgs e)
{
string query = SearchTextBox.Text;
string result = await SearchAsync(query);
ResultTextBox.Text = result;
}
private async Task<string> SearchAsync(string query)
{
using (HttpClient client = new HttpClient())
{
string url = $"https://api.example.com/search?q={query}";
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
}
}
async
和 await
时,可能会遇到跨线程操作异常。原因:WinForms 控件不是线程安全的,只能在创建它们的线程(通常是 UI 线程)上进行操作。
解决方法:
Control.Invoke
或 Control.BeginInvoke
:在异步操作完成后,使用这些方法将更新 UI 的代码调度回 UI 线程。private async void SearchButton_Click(object sender, EventArgs e)
{
string query = SearchTextBox.Text;
string result = await SearchAsync(query);
this.Invoke((MethodInvoker)delegate
{
ResultTextBox.Text = result;
});
}
SynchronizationContext
:捕获当前的 SynchronizationContext
并在异步操作完成后使用它来调度 UI 更新。private readonly SynchronizationContext _uiContext;
public MainForm()
{
InitializeComponent();
_uiContext = SynchronizationContext.Current;
}
private async void SearchButton_Click(object sender, EventArgs e)
{
string query = SearchTextBox.Text;
string result = await SearchAsync(query);
_uiContext.Post(_ => ResultTextBox.Text = result, null);
}
通过以上内容,你应该能够理解在 C# WinForms 中使用 async
和 await
的基础概念、优势、类型、应用场景以及常见问题的解决方法。
领取专属 10元无门槛券
手把手带您无忧上云