我有一个应用程序可以在另一个帖子中进行一些下载。文件的大小太大,无法在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”部分之外,其他一切都运行正常。它根本不更新。我尝试使用调度程序没有不同的结果。
答案 0 :(得分:0)
我发现您发布的代码根本没有任何根本错误。因此,如果存在问题,则可能在代码的另一部分中,此处未包含此问题。与往常一样,提供完整的和简明代码示例更好。请参阅https://stackoverflow.com/help/mcve。
如果您期望在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));
}
换句话说,假设操作是在UI线程上启动的,那么当您处理Dispatcher.BeginInvoke()
方法时,无需调用async
。根据{{1}}方法的需要,您只需await
即可完成,并且通常会在UI线程上发生其他所有事情。
上述变化包括简单地将Read()
称为"点火并忘记":
parse()
或者让void someEventHandler(object sender, RoutedEventArgs e)
{
var _ = parse();
}
方法实际返回parse()
对象并让事件处理程序更新位图:
Article
您可以重新排列代码,将与UI相关的操作放在事件处理程序或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;
}
方法中,以满足您的偏好。