2015-05-29 84 views
1

我正在嘗試在VS 2013上的新C#4.5 Web應用程序中使用異步/等待代碼。它是在IISExpress下我的開發人員計算機上運行的Web應用程序。我在異步方法中設置斷點,並可以看到該方法按預期完成。但是,等待電話後的下一行代碼看起來並沒有被擊中。我在那裏有一個斷點,它沒有被打到,我嘗試了一下代碼。它似乎在那裏等待無限。我試着在控制檯應用程序中運行相同的代碼,並且工作正常。 這使我想知道異步/等待調試在Web應用程序中無法工作,或者它可能與IISExpress有關?還是有什麼我失蹤?調用C#異步方法不會在Web應用程序中返回

的代碼是非常基本的,看起來像這樣:

public async Task SomeMethodAsync(string parameter1) 
{ 

} 

...代碼調用上述異步方法:

await SomeMethodAsync("some value"); 
+1

你在使用什麼Web框架? 如果您使用的是Asp.Net MVC,則必須在控制器中使用異步操作: http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4 – DaniCE

+1

代碼跑過了等待?把一些日誌記錄在那裏,看看它是否是一個「調試」問題,或者你的異步方法可能永遠不會完成。 –

+0

@DaniCE,謝謝,它是一個經典的Web窗體。 –

回答

0

我得到它的工作。這是導致這種情況的代碼結構(不包括在我的問題中)。它是一個Web窗體應用程序的事實似乎也是一個因素。原來的代碼是這樣的:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    var task = RunSample(); 
    task.Wait(); 
} 

private static async Task RunSample() 
{ 
    await SomeMethodAsync("some value"); 
} 

事實證明,而異步方法運行,代碼的執行是要task.Wait()在按鈕單擊處理程序,和等候在那裏。我不希望代碼去那裏(這是我從一個控制檯應用程序複製的代碼...)

我決定將RunSample()代碼移入按鈕點擊處理程序,就像這樣,消除了RunSample ():

protected async void Button1_Click(object sender, EventArgs e) 
{ 
    await SomeMethodAsync("some value"); 
} 

這導致了一個錯誤最初從該異步=「真」需要被添加到@Page指令的編譯器。這樣做後,它開始按預期工作。即使使用我的原始代碼,並且Async =「true」,那也不起作用。我相信的關鍵是按鈕點擊處理程序標有async關鍵字。

感謝@NielsFilter和@DaniCE來跟進問題,讓我進一步瞭解這一點。

+1

太好了。重要的是要記住的是儘量不要混合TPL方法,如.Wait和.Result與異步和等待。由於實際上等待「捕獲上下文」並且.Wait和.Result被阻塞,等待等待返回結果,那麼最終可能導致死鎖。有關更多詳細信息,請參閱我的博客中的異步陷阱編號2:https://filteredcode.wordpress.com/2015/05/27/async-pitfalls-part-4-of-4/ –

+1

我有[博客文章](http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html),詳細描述這個問題。您也可以找到我的[關於異步最佳實踐的MSDN文章](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)和[關於異步ASP.NET的MSDN文章](https:// msdn .microsoft.com/en-us/magazine/dn802603.aspx)很有幫助。 –