Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#异步方法中断应用程序_C#_Windows_Asynchronous_Methods_Web - Fatal编程技术网

C#异步方法中断应用程序

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

因此,我有一个应用程序,是检索网络信息。在获得这些信息后,我需要处理返回的对象(JSON字符串)。 然而,据我所知,我的程序一直在中断,因为当web信息等待时,它会跳转到下一个处理阶段,没有数据要处理,因此中断。 我怎样才能着手修理它呢

下面是异步方法

    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。结果不完全一致-您的代码不会编译。。。