2015-04-07 107 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。我将确保将来使用它!