C#异步方法中断应用程序
因此,我有一个应用程序,是检索网络信息。在获得这些信息后,我需要处理返回的对象(JSON字符串)。 然而,据我所知,我的程序一直在中断,因为当web信息等待时,它会跳转到下一个处理阶段,没有数据要处理,因此中断。 我怎样才能着手修理它呢 下面是异步方法C#异步方法中断应用程序,c#,windows,asynchronous,methods,web,C#,Windows,Asynchronous,Methods,Web,因此,我有一个应用程序,是检索网络信息。在获得这些信息后,我需要处理返回的对象(JSON字符串)。 然而,据我所知,我的程序一直在中断,因为当web信息等待时,它会跳转到下一个处理阶段,没有数据要处理,因此中断。 我怎样才能着手修理它呢 下面是异步方法 async private Task GetInformation(string url) { client = new HttpClient(); response = await client
async private Task GetInformation(string url)
{
client = new HttpClient();
response = await client.GetAsync(new Uri(url));
result = await response.Content.ReadAsStringAsync();
}
正如下面提到的,我应该将wait放在调用GetInformation的位置前面,但是,该方法用于将字符串返回到另一个类,如
public string GetResult(string url)
{
GetInformation(url);
return result;
}
我怎样才能解决这个问题
感谢您的帮助您呼叫
获取信息(url)
的地方还必须有等待
关键字:
// stage1
//... some code ...
// stage2
await GetInformation(url);
// stage3
//... some code ...
如果没有wait
,您的方法将启动下载,但它与阶段3并行运行
当您无法使该方法异步时,wait
的替代方法是在另一个线程中启动任务并等待该线程完成:
Task.Run(() => GetInformation(url)).RunSynchronously(); // use .Result if you have Task<T>
Task.Run(()=>GetInformation(url)).RunSynchronously();//如果有任务,请使用.Result
如果您的代码没有在UI线程上运行,则可以跳过Task.Run()
,然后只需调用GetInformation(url).RunSynchronously()
。如果它确实在UI线程上运行,那么没有任务。运行会有死锁的风险
第三种选择是使用锁定机制,如ManualResetEvent
。如果前面的方法不起作用,请使用该类查找示例。调用GetInformation(url)
的地方也必须有wait
关键字:
// stage1
//... some code ...
// stage2
await GetInformation(url);
// stage3
//... some code ...
如果没有wait
,您的方法将启动下载,但它与阶段3并行运行
当您无法使该方法异步时,wait
的替代方法是在另一个线程中启动任务并等待该线程完成:
Task.Run(() => GetInformation(url)).RunSynchronously(); // use .Result if you have Task<T>
Task.Run(()=>GetInformation(url)).RunSynchronously();//如果有任务,请使用.Result
如果您的代码没有在UI线程上运行,则可以跳过Task.Run()
,然后只需调用GetInformation(url).RunSynchronously()
。如果它确实在UI线程上运行,那么没有任务。运行会有死锁的风险
第三种选择是使用锁定机制,如ManualResetEvent
。如果前面的方法不起作用,请使用此类查找示例。使用以下代码
private async Task<string> GetInformation(string url)
{
client = new HttpClient();
response = await client.GetAsync(new Uri(url));
return await response.Content.ReadAsStringAsync();
}
使用以下代码
private async Task<string> GetInformation(string url)
{
client = new HttpClient();
response = await client.GetAsync(new Uri(url));
return await response.Content.ReadAsStringAsync();
}
也许您可以为等待响应设置一个时限?考虑在Taskk上使用CaseCuaAuthEffice(FALSE),也许您可以为等待响应设置一个时限?考虑使用TaskUnAuthAt(false)在Taskand当然方法调用<代码> GETIONS 还必须是“代码>异步”/代码> OK,那太好了,但是,我调用的GetInformation方法被用来将结果返回给另一个类。我更新了OP以显示我所做的mean@AndyOHart-这不会改变任何事情-使该方法异步
,然后调用它的方法等。如果你做不到,我添加了一个替代答案。我使GetResult异步,并让它返回一种任务类型,但是,当我尝试将字符串设置为此,它说它不能是Task.string的类型,当然调用GetInformation
的方法也必须是async
好的,这很好,但是调用GetInformation的方法被用来将结果返回给另一个类。我更新了OP以显示我所做的mean@AndyOHart-这不会改变任何事情-使该方法异步
,然后调用它的方法等。如果你做不到,我添加了一个替代答案。我使GetResult异步,并让它返回一种任务类型,但是,当我尝试将字符串设置为此,它说它不能是Task.string.await
和Task.Result
的一种类型。结果不完全一致-您的代码不会编译…await
和Task。结果不完全一致-您的代码不会编译。。。