调用方法直到它返回值

本文关键字:返回值 方法 调用 | 更新日期: 2023-09-27 17:53:34

我想调用一个方法,直到它在我的WPF应用程序返回一个值。

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();上抛出了一个错误

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

为什么我不能访问它,为什么另一个线程拥有它?

调用方法直到它返回值

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

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

您还可以使用control. dispatcher . checkaccess()来检查当前线程是否拥有该控件。如果它确实拥有它,那么您的代码看起来正常。

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

txtBarcodeContent.Text = i.ToString();

task.Wait();破坏异步效果。

<标题> 解决方案

点击方式可以有async

这个工作:注意我只async当我await和我避免async void(使用async没有等待)。

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();
}