我有一个应用程序可以在另一个线程中进行一些下载。文件大小太大,无法在 UI 线程中下载,因为它会冻结 UI..
初始化线程:
Thread oThread = new Thread(new ThreadStart(parse));
在“解析”异步方法中: (Reader 和 Article 是 ReadSharp 库的方法)
source.Foreground = new SolidColorBrush(Colors.Black);
title.Foreground = new SolidColorBrush(Colors.Black);
tt.Opacity = 0;
Reader reader = new Reader();
Article article;
article = await reader.Read(new Uri(ids));
tt.Opacity = 0.5;
source.Foreground = new SolidColorBrush(Colors.White);
title.Foreground = new SolidColorBrush(Colors.White);
featuredimg.Dispatcher.BeginInvoke(
(Action)(() => { featuredimg.Source = new BitmapImage(new Uri(article.FrontImage.ToString(), UriKind.Absolute)); }));
除了代码的“featuredimg.Source”部分之外,一切正常。它根本不更新。我尝试使用调度程序,但没有不同的结果。
如果您期望当
oThread
对象完成时位图将被初始化,那么这种期望是不正确的。一旦 parse()
方法到达 await reader.Read(new Uri(ids));
语句,线程本身就会退出。
尽管如此,你至少可以改进你现在所拥有的。这里不需要使用显式的
Thread
对象,而且只会造成妨碍。相反,你应该有这样的东西:
async void someEventHandler(object sender, RoutedEventArgs e)
{
await parse();
}
async Task parse()
{
source.Foreground = new SolidColorBrush(Colors.Black);
title.Foreground = new SolidColorBrush(Colors.Black);
tt.Opacity = 0;
Reader reader = new Reader();
Article article;
article = await reader.Read(new Uri(ids));
tt.Opacity = 0.5;
source.Foreground = new SolidColorBrush(Colors.White);
title.Foreground = new SolidColorBrush(Colors.White);
featuredimg.Source = new BitmapImage(
new Uri(article.FrontImage.ToString(), UriKind.Absolute));
}
换句话说,当您处理
Dispatcher.BeginInvoke()
方法时,无需调用 async
,假设该操作是在 UI 线程上启动的。您只需根据需要 await
即可完成 Read()
方法,然后让其他一切在 UI 线程上正常发生。
上述内容的变体包括简单地将
parse()
称为“即发即忘”:
void someEventHandler(object sender, RoutedEventArgs e)
{
var _ = parse();
}
或者让
parse()
方法实际返回 Article
对象并让事件处理程序更新位图:
async void someEventHandler(object sender, RoutedEventArgs e)
{
Article article = await parse();
featuredimg.Source = new BitmapImage(
new Uri(article.FrontImage.ToString(), UriKind.Absolute));
}
async Task<Article> parse()
{
source.Foreground = new SolidColorBrush(Colors.Black);
title.Foreground = new SolidColorBrush(Colors.Black);
tt.Opacity = 0;
Reader reader = new Reader();
Article article;
article = await reader.Read(new Uri(ids));
tt.Opacity = 0.5;
source.Foreground = new SolidColorBrush(Colors.White);
title.Foreground = new SolidColorBrush(Colors.White);
return article;
}
您可以重新排列代码,将 UI 相关操作放入事件处理程序或
parse()
方法中以满足您的偏好。