2016-05-17 145 views
12

我想在Async方法中使用Func。我收到一個錯誤。使用Func委託與異步方法

無法將異步lambda表達式轉換爲委託類型'Func<HttpResponseMesage>'。異步lambda表達式可能返回void,Task或Task<T>,其中沒有一個可轉換爲'Func<HttpResponseMesage>'。下面

是我的代碼:

public async Task<HttpResponseMessage> CallAsyncMethod() 
{ 
    Console.WriteLine("Calling Youtube"); 
    HttpClient client = new HttpClient(); 
    var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM"); 
    Console.WriteLine("Got Response from youtube"); 
    return response; 
} 

static void Main(string[] args) 
{ 
    Program p = new Program(); 
    Task<HttpResponseMessage> myTask = p.CallAsyncMethod(); 
    Func<HttpResponseMessage> myFun =async() => await myTask; 
    Console.ReadLine(); 
} 
+1

我有關於[異步委託類型](http://blog.stephencleary.com/2014/02/synchronous-and-asynchronous-delegate.html)的博客文章,您可能會發現有幫助。 –

回答

21

由於錯誤說,異步方法返回TaskTask<T>void。因此,爲了得到這個工作,你可以:

Func<Task<HttpResponseMessage>> myFun = async() => await myTask; 
+1

請注意,當用戶按下某個鍵時,可能無法完成異步操作,而Console.ReadLine()完成。在異步操作完成之前,應用程序可能會終止,除非您在「任務」上顯式地「等待」。 –

1

代碼修復,如:

static void Main(string[] args) 
     { 
      Program p = new Program(); 
      Task<HttpResponseMessage> myTask = p.CallAsyncMethod(); 
      Func<Task<HttpResponseMessage>> myFun = async() => await myTask; 
      Console.ReadLine(); 
     } 
0

我通常採取的路徑是有Main方法調用Run()方法返回一個任務,並.Wait()Task上完成。

class Program 
{ 
    public static async Task<HttpResponseMessage> CallAsyncMethod() 
    { 
     Console.WriteLine("Calling Youtube"); 
     HttpClient client = new HttpClient(); 
     var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM"); 
     Console.WriteLine("Got Response from youtube"); 
     return response; 
    } 

    private static async Task Run() 
    { 
     HttpResponseMessage response = await CallAsyncMethod(); 
     Console.ReadLine(); 
    } 

    static void Main(string[] args) 
    { 
     Run().Wait(); 
    } 
} 

這使您的其他控制檯應用程序可以在完全異步/等待支持下運行。由於控制檯應用程序中沒有任何UI線程,因此使用.Wait()時不會出現死鎖的風險。