Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个线程更新UI线程仅对某些值有效_C#_Multithreading_Windows Phone 8_Windows Phone - Fatal编程技术网

C# 从另一个线程更新UI线程仅对某些值有效

C# 从另一个线程更新UI线程仅对某些值有效,c#,multithreading,windows-phone-8,windows-phone,C#,Multithreading,Windows Phone 8,Windows Phone,我有一个应用程序,可以在另一个线程中进行下载。文件太大,无法在UI线程中下载,因为它冻结了UI 初始化线程: Thread oThread = new Thread(new ThreadStart(parse)); 在“parse”异步方法中: (读者和文章是ReadSharp图书馆的方法) 除了代码中的“featuredimg.Source”部分外,其他一切都正常工作。它只是不更新。我尝试使用dispatcher,但没有得到任何不同的结果。我看不出您发布的代码有任何根本性的错误。所以如果有问

我有一个应用程序,可以在另一个线程中进行下载。文件太大,无法在UI线程中下载,因为它冻结了UI

初始化线程:

Thread oThread = new Thread(new ThreadStart(parse));
在“parse”异步方法中: (读者和文章是ReadSharp图书馆的方法)


除了代码中的“featuredimg.Source”部分外,其他一切都正常工作。它只是不更新。我尝试使用dispatcher,但没有得到任何不同的结果。

我看不出您发布的代码有任何根本性的错误。所以如果有问题,很可能是代码的另一部分,这里没有包括。和往常一样,最好提供一个完整简洁的代码示例。看

如果您期望当
oThread
对象完成时位图将被初始化,那么该期望是不正确的。只要
parse()
方法到达
wait reader.Read(新Uri(ID)),线程本身就会退出语句

尽管如此,你至少可以改善你现在似乎拥有的东西。这里不需要使用显式的
线程
对象,只会造成阻碍。相反,您应该有如下内容:

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));
}
换句话说,在处理
async
方法时,假设操作是在UI线程上启动的,则无需调用
Dispatcher.BeginInvoke()
。您只需根据需要等待
Read()
方法完成,然后让UI线程上的所有事情正常进行

上面的变体包括简单地调用
parse()
作为“fire and forget”:

或者让
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;
}
async void someEventHandler(对象发送方,RoutedEventTargs e)
{
Article=等待解析();
featuredimg.Source=新位图图像(
新的Uri(article.FrontImage.ToString(),UriKind.Absolute));
}
异步任务解析()
{
source.Foreground=新的SolidColorBrush(Colors.Black);
title.前台=新的SolidColorBrush(Colors.Black);
tt.不透明度=0;
读卡器=新读卡器();
第条;
article=wait reader.Read(新Uri(ID));
tt.不透明度=0.5;
source.Foreground=新的SolidColorBrush(Colors.White);
title.前台=新的SolidColorBrush(Colors.White);
退货物品;
}

您可以重新排列代码,将与UI相关的操作放入事件处理程序或
parse()
方法,以符合您的偏好。

该线程是必需的,因为将下载放入UI线程会导致其延迟,直到下载完成。有没有办法延迟线程直到加载bitmapimage?如果没有更多上下文,我无法解决这个问题。但是,
reader.Read()
方法应该是异步的(正如您等待它的事实所表明的那样)。因此,即使没有在新线程中包装对
parse()
的调用,下载也不应该阻止UI线程。最佳做法是始终在任何
async
方法调用周围使用try/catch,并且始终
等待
返回,即使它是
void
或您不需要它。这可以在调用树中的任何位置执行,但在
async
事件处理程序中始终是一个好主意。如果您没有显式捕获异常,并且抛出异常,那么在GC运行并清除失败的
任务
对象时,您将在将来的某个时间点得到一个随机的、不可调试的“未观察到的故障异常”。
void someEventHandler(object sender, RoutedEventArgs e)
{
    var _ = parse();
}
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;
}