从另一个线程更新UI线程仅适用于某些值

时间:2014-12-06 22:44:08

标签: c# multithreading windows-phone-8 windows-phone

我有一个应用程序可以在另一个帖子中进行一些下载。文件的大小太大,无法在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”部分之外,其他一切都运行正常。它根本不更新。我尝试使用调度程序没有不同的结果。

1 个答案:

答案 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; } 方法中,以满足您的偏好。