簡體   English   中英

無法在 GetAwaiter().GetResult() 上將類型“void”隱式轉換為“object”

[英]Cannot implicitly convert type 'void' to 'object' on GetAwaiter().GetResult()

我們使用以下代碼來等待方法執行,因為我們有必須使用異步方法的同步方法,這是我們在項目中使用的包裝器

public dynamic RunTask(dynamic method) {
   var result = Task.Run(async () => await method).ConfigureAwait(false);
   return result.GetAwaiter().GetResult();
}

當方法具有返回類型時,這行代碼似乎可以正常工作: Task< int > 但是今天當我編寫非返回方法時,當 Task 沒有返回值時它會拋出異常

   // throws exception in this case 'Cannot implicitly convert type 'void' to 'object'
   public async Task Run(){
        await //;
   }

   // Works
   public async Task<int> Fun(){
      return await //;
   }

從消息中,它顯然無法將 void 分配給 object 但是我是否缺少一些東西,如何讓它工作 void 任務。 我們正在使用 .net 內核 3.1。 任何幫助是極大的贊賞。

你在打電話嗎 RunTask(); 該方法不返回任何內容? :)

首先這是一個不好的做法。 異步調用的最佳方式是遵循等待模式。 這是這樣的

private Task MyMethodAsync(){

}


public async void Main(){
    await MyMethodAsync();
}

現在,如果它還沒有到位,那么實現 await 模式可能會有點困難(因為它可能需要等待鏈中的所有調用)。 你能做的如下:

MyMethodAsync().Wait()

這將阻塞調用線程並等待任務完成。 因為它是無效的,所以你不會得到任何結果,這就是你首先得到這個異常的主要原因。

您可以根據自己的目的嘗試此代碼,但正如 Marc 建議的那樣,這不是推薦的做法:

   public dynamic RunTask(dynamic method)
    {
       if (method is Task)
        {
            method.ConfigureAwait(false).GetAwaiter().GetResult();
            return 0;
        }
        else
        {
            var result = Task.Run(async () => await method).ConfigureAwait(false);
            return result.GetAwaiter().GetResult();
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM