2015-04-07 106 views
-2

我試圖開始使用.net 4.5中的異步方法,我想我已經想通了,但現在當我試圖在func中做到這一點,但我不能得到以下內容工作:async lambda在等待方法返回前沒有返回

Action task = async() => 
    { 

      await _db.SaveChangesAsync(); 
      Debug.WriteLine("Save completed"); 

    }; 

task(); 

Debug.WriteLine("Returned");   

輸出將是: 保存完成 返回

我希望它是相反的順序。

任何想法?

謝謝!

編輯1:

我創建了一個示例代碼,以顯示我想要的東西,而奇怪的是,它完美的作品:

static void Main(string[] args) 
    { 
     using (BCFdbEntities db = new BCFdbEntities()) 
     { 
      IssueComment ic = db.IssueComments.First(); 

      ic.Comment = DateTime.Now.ToString() ; 

      Action a = async() => 
       { 
        await db.SaveChangesAsync(); 

        Console.WriteLine("Save completed"); 

       }; 

      a(); 
      Console.WriteLine("Returned"); 

      Console.ReadLine(); 

     } 



    } 
} 

但是,我不能讓完全相同的代碼在我的實時代碼中工作。 該代碼是商業工具插件的一部分,他們是否可以阻止它?

+0

你是什麼意思的「我不能得到以下工作」?目前還不清楚你想要實現什麼,你期望發生什麼,實際發生了什麼,或者你正在使用什麼上下文(控制檯應用程序,Web應用程序,winforms/wpf應用程序)。 –

+0

對不起,約翰,我無意中發佈它之前,我已經完成了它,而我是插件標籤。 – Erik83

+0

好吧,SaveChangesAsync是做什麼的? (這是EF例如?)你可以發佈一個簡短的,但*完整的*程序展示問題? –

回答

0

我期望它是在相反的順序。

你不能指望什麼,對不起。這是一個競賽條件。

如果要等待代碼完成,則不能使用Action。無論如何,你真的不應該使用Actionasync lambda,因爲他們創建了一個async void方法。你應該避免async void(更多詳情請參閱我的MSDN article)。

相反,您需要使用async等效的Action,這是Func<Task>(我描述了這個更多on my blog)。隨着Func<Task>,調用代碼現在可以await拉姆達的執行:

Func<Task> task = async() => 
{ 
    await _db.SaveChangesAsync(); 
    Debug.WriteLine("Save completed"); 
}; 

await task(); 
Debug.WriteLine("Returned"); 
+0

好吧,嗯,我試過你的解決方案,但它有相同的結果。 我刪除了await語句,因爲我不想等待任務,我想等待_db.SaveChangesAsync()方法,並且不要阻塞我的主線程。 – Erik83

0

我想我解決了這個問題。 保存過程非常快以至於沒有等待該方法。 我添加了Task.Delay(5000)來減慢速度,看看是否如此,然後按預期工作。在此之後,我測量了執行時間,僅僅是12毫秒,並不確定如何測量異步方法,因此我包含的代碼比可能需要的更多。

  Stopwatch sw = new Stopwatch(); 
      sw.Start(); 

      Func<Task> task = async() => 
      { 
       // await Task.Delay(5000); 
       await _db.SaveChangesAsync(); 
       Debug.WriteLine("Save completed"); 
      }; 

      task(); 
      Debug.WriteLine("Returned"); 

      sw.Stop(); 

反正我沒想到編譯器擁有的是否等待的方法或沒有想法,但apperently它。

感謝Stephen Cleary對Func的建議而不是Action。我將確保將來使用它!