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

问题描述 投票:0回答:1

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

c# multithreading windows-phone-8 windows-phone
1个回答
0
投票

如果您期望当

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()
方法中以满足您的偏好。

© www.soinside.com 2019 - 2024. All rights reserved.