C#任务获取结果或捕获异常
我有: 我怎么做?C#任务获取结果或捕获异常,c#,.net,task-parallel-library,async-await,task,C#,.net,Task Parallel Library,Async Await,Task,我有: 我怎么做? 谢谢你把它弄混了一点。当您的方法签名为: string rez1; static void test() { Task.Factory.StartNew(() => { //How can I get result like rez1= httpRequest((HttpWebRequest)HttpWebRequest.Create("google.com"))); //or catch Web
谢谢你把它弄混了一点。当您的方法签名为:
string rez1;
static void test()
{
Task.Factory.StartNew(() => {
//How can I get result like rez1= httpRequest((HttpWebRequest)HttpWebRequest.Create("google.com")));
//or catch WebException here.
});
}
公共静态异步任务httpRequest(HttpWebRequest)
这意味着“此方法是异步调用的,我将调用它,它将立即返回,并承诺在将来完成”
您应该将方法更改为如下所示:
编辑
根据评论修正了代码
public static async Task<string> httpRequest(HttpWebRequest request)
公共静态任务httpRequest(HttpWebRequest请求)
{
返回Task.Factory.Startnew(()=>{
返回HttpWebRequest.Create(“google.com”)
}
}
当您的方法被标记为异步时,这意味着调用方可能认为它是“纯”异步的,这意味着没有线程在幕后执行。如果您确实启动了一个新线程(正如您在这里所做的,使用线程池线程),您应该显式地注释您的方法,并告诉调用方他将启动一个新线程
如果您使用的是.NET4.5,并且有权访问新的HttpClient类,则可以避免启动新任务
您可以将方法更改为如下所示:
public static Task<string> httpRequest(HttpWebRequest request)
{
return Task.Factory.Startnew(() = > {
return HttpWebRequest.Create("google.com")
}
}
公共静态异步任务httpRequest(HttpWebRequest)
{
var httpClient=新的httpClient();
var response=wait httpClient.GetAsync(“http://www.google.com")
var stringResult=await response.Content.ReadAsStringAsync();
返回结果;
}
我不明白。什么不起作用或者你在哪里有困难?在行动中,我将其发布到StartNew()方法我抓不到例外我不是专家。但是如果httpRequest
是async
,这不意味着你不需要自己启动任务吗?它将由函数为你完成?你在上面的回答中犯了一个常见错误。你不需要在方法体中等待。你只需返回任务即可代码>结果来自ReadStringAsync
并从httpRequest
@bradgonessurfing>中删除async
声明:“您只需从ReadStringAsync返回任务
结果,并从httpRequest
中删除异步声明即可。”-这是错误的,您提出的更改不会编译事件。您必须从异步任务
方法返回字符串
。如果不清楚我的意思,请查看此处更新的代码。实际上您是对的。因为我无法消除httpClient.GetAsync上的第一个等待,因此我被迫等待第二个任务。
public static Task<string> httpRequest(HttpWebRequest request)
{
return Task.Factory.Startnew(() = > {
return HttpWebRequest.Create("google.com")
}
}
public static async Task<string> httpRequest(HttpWebRequest request)
{
var httpClient = new HttpClient();
var response = await httpClient.GetAsync("http://www.google.com")
var stringResult = await response.Content.ReadAsStringAsync();
return stringResult;
}