我正在调用位于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#的线程,封送等不是很熟悉。谢谢。
2条答案
按热度按时间edqdpe6u1#
第一个功能应该是:
作为一个
async
函数,它应该包含一个await
语句。试图通过使用Task(....).Result()
或其他方法使异步函数同步运行有点像雷区,请参阅this blog以获得一些解释。另请参见async/await - when to return a Task vs void?--
async void
函数的异常处理不同于async Task
函数。35g0bw712#
我已经通过应用@M.M的解决方案解决了这个异常。我所做的是将
TEXT1_STRING = Task.Run(() => App.GetJSONAsync()).Result;
返回到TEXT1_STRING = await App.GetJSONAync();
在此更改之后,未引发异常,并且程序能够成功生成和运行。
UpdateText()
的修复版本: