【发布时间】:2016-05-12 11:23:10
【问题描述】:
我对 C# 中的线程非常陌生。我有一个搜索字段,它在每个按下的键上触发针对 API 的 HTTP 请求。在请求之后,Searchresult 将显示在我的 SearchTab 的 ListView 中。当然,这会使 UI 冻结几毫秒,直到 HTTP 请求完成。所以我尝试使请求异步。
private async void textBoxSearch_KeyUp(object sender, KeyEventArgs e)
{
SearchTab searchTab;
Task<SearchContainer<SearchMovie>> searchTask = searchMovie(textBoxSearch.Text);
if (searchTabExists())
{
searchTab = getSearchTab();
}
else
{
searchTab = new SearchTab();
mainTabControl.Items.Insert(mainTabControl.Items.Count, searchTab);
}
searchTab.IsSelected = true;
SearchContainer<SearchMovie> results = await searchTask;
searchTab.updateSearch(results);
}
async Task<SearchContainer<SearchMovie>> searchMovie(String query)
{
var today = await Task.FromResult<SearchContainer<SearchMovie>>(tmdbClient.SearchMovie(query, "de"));
return today;
}
这段代码让它变得更好了,但它仍然让 UI 冻结了一点,因为在某些时候它必须等待 API-Call。如果 API-Call 在进行另一次搜索 (KeyPressed) 之前及时完成,我希望能够流畅地键入我的搜索而不会中断并显示结果。
你如何在 C# 中解决这样的问题?在 JAVA 中,我会使用 AsyncWorker,它在搜索完成后调用 Displaymethod(或者如果进行了另一次搜索,则取消工作人员),这样搜索和显示就不会在主线程中完成。
C# 中有类似的构造吗?如果我搜索多线程,我只能找到异步等待解决方案。或者可以按照我希望的方式使用它。
【问题讨论】:
-
我在这段代码中看不到任何异步内容。所有调用都是同步的。
-
"在 JAVA 中我会使用
AsyncWorker" 是的,.net 等效项称为BackgroundWorker,而这正是async/await旨在取代的。Task.FromResult用于使用异步 API 进行同步工作。
标签: c# wpf multithreading async-await