调用方法直到它返回值

时间:2015-06-04 08:58:04

标签: c# wpf c#-4.0

我想调用一个方法,直到它在我的WPF app中返回一个值。

void btnDecode_Click(object sender, RoutedEventArgs e)
{
    var task = new Task(task);
    task.Start();
    task.Wait();
}

async void task()
{
    Task<object> result= DecodedResult((BitmapSource)imageBarcode.Source);
    object i = await result;
    txtBarcodeContent.Text = i.ToString();
}

async Task<object> DecodedResult(BitmapSource renderTargetBitmap)
{
    var reader = new BarcodeReader();
    txtBarcodeContent.Text = "reading";

    return reader.Decode(renderTargetBitmap);
}

但它在task.Start();

上引发了错误
  

“附加信息:调用线程无法访问此对象   因为一个不同的线程拥有它。“

为什么我无法访问它以及为什么另一个线程拥有它?

2 个答案:

答案 0 :(得分:1)

每当您从主线程以外的线程更新UI元素时,您需要使用:

this.Dispatcher.Invoke((Action)(() =>
{
       ...// your code here.
}));

您还可以使用control.Dispatcher.CheckAccess()来检查当前线程是否拥有该控件。如果它拥有它,您的代码看起来很正常。否则,请使用上述模式。

答案 1 :(得分:1)

除了UI线程之外,这在任何地方都是非法的。

task.Wait();

async破坏了异步效应。

解决方案

点击方法可以async

这是有效的:请注意我await时只async void而我private async void btnDecode_Click(object sender, RoutedEventArgs e) { string result = await DecodedResult((BitmapSource)imageBarcode.Source); txtBarcodeContent.Text = result; } private async Task<string> DecodedResult(BitmapSource renderTargetBitmap) { object decoded = await reader.Decode(renderTargetBitmap); return decoded.ToString(); } Using async without await)。

@server:~$ mkdir -p /home/myuser/domain.git && chmod 770 /home/myuser/domain.git && cd /home/myuser/domain.git && git init --bare