json 从页调用静态异步方法会导致InteropServices.COMException错误

cclgggtu  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(136)

我正在调用位于App.xaml.cs文件中的异步方法。我正在从主页(HomePageView.xaml.cs)的C#文件调用此方法。我不知道为什么,但我得到此错误:
System.Runtime.InteropServices.COMException: 'The application called an interface that was marshalled for a different thread. (0x8001010E (RPC_E_WRONG_THREAD))'在以TEXT1_STRING开头的行上抛出此异常。
UpdateText()方法为:

private async void UpdateText()
{
    HomePageViewText1.Text = "error text";

    TEXT1_STRING = Task.Run(() => App.GetJSONAsync()).Result;
    
    return;
}

GetJSONAsync()方法代码如下:

internal static async Task<string> GetJSONAsync()
{
    string JSON = null;

    using HttpClient client = new HttpClient();

    try
    {
        JSON = await client.GetStringAsync("https://www.example.com/api/getdata");
    }
    catch (Exception e)
    {
        log.Error("Error fetching JSON" + e.ToString());
    }

    return JSON;
}

有谁能告诉我为什么会发生这种情况吗?我对C#的线程,封送等不是很熟悉。谢谢。

edqdpe6u

edqdpe6u1#

第一个功能应该是:

private async Task UpdateText()
{
    HomePageViewText1.Text = "error text";

    TEXT1_STRING = await GetJSONAsync();

    return;
}

作为一个async函数,它应该包含一个await语句。试图通过使用Task(....).Result()或其他方法使异步函数同步运行有点像雷区,请参阅this blog以获得一些解释。
另请参见async/await - when to return a Task vs void?--async void函数的异常处理不同于async Task函数。

35g0bw71

35g0bw712#

我已经通过应用@M.M的解决方案解决了这个异常。我所做的是将TEXT1_STRING = Task.Run(() => App.GetJSONAsync()).Result;返回到TEXT1_STRING = await App.GetJSONAync();
在此更改之后,未引发异常,并且程序能够成功生成和运行。
UpdateText()的修复版本:

private async void UpdateText()
{
    HomePageViewText1.Text = "error text";

    TEXT1_STRING = await App.GetJSONAync();
    
    return;
}

相关问题