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;
}