2013-03-15 98 views
2

我的RestSharp實現有以下問題。如何在繼續之前讓我的應用程序等待來自ExecuteAsync()的響應?等待ExecuteAsync()結果

我嘗試了不同的解決方案:

優先(該方法不等待ExecuteAsync響應):

public Task<Connection> Connect(string userId, string password) 
    { 
     var client = new RestClient(_baseUrl) 
      { 
       Authenticator = new SimpleAuthenticator("user", userId, 
        "password", password) 
      }; 
     var tcs = new TaskCompletionSource<Connection>(); 
     var request = new RestRequest(AppResources.Authenticating); 
     client.ExecuteAsync<Connection>(request, response => 
      { 
       tcs.SetResult(new JsonDeserializer(). 
        Deserialize<Connection>(response)); 
      }); 
     return tcs.Task; 
    } 

所以我想這一點,但應用程序凍結:

public Task<Connection> Connect(string userId, string password) 
    { 
     EventWaitHandle executedCallBack = new AutoResetEvent(false); 
     var client = new RestClient(_baseUrl) 
      { 
       Authenticator = new SimpleAuthenticator("user", userId, 
        "password", password) 
      }; 
     var tcs = new TaskCompletionSource<Connection>(); 
     var request = new RestRequest(AppResources.Authenticating); 
     client.ExecuteAsync<Connection>(request, response => 
      { 
       tcs.SetResult(new JsonDeserializer(). 
          Deserialize<Connection>(response)); 
       executedCallBack.Set(); 
       }); 
     executedCallBack.WaitOne(); 
     return tcs.Task; 
    } 
+0

什麼是RestClient? – Default 2013-03-15 16:06:51

+1

它來自'RestSharp'庫,一種'WebClient' – user2169047 2013-03-16 09:41:39

+0

什麼是連接?我無法在RestSharp中找到此課程 – adrian4aes 2015-12-09 14:34:02

回答

3

我想你錯過了任務和異步/等待模式的要點。

你不用等待這個方法,但是因爲你要返回一個Task<>它允許調用者在它選擇的時候等待它。

呼叫者會是這樣的:

public async void ButtonClick(object sender, RoutedEventArgs args) 
{ 
    Connection result = await restClient.Connect(this.UserId.Text, this.Password.Text); 

     //... do something with result 
} 

編譯器知道如何使這個代碼,這是非常相似的同步(阻塞)等同,並把它變成異步代碼。

請注意asyncawait關鍵字,並注意Task<Connection>已轉入Connection

鑑於:您的第一個代碼片段看起來不錯。

第二個可能會導致一個問題,因爲你引入另一個線程機制(即信號量AutoResetEvent)。另外@HaspEmulator是正確的 - 如果這是在UI線程上,這是已知的WP應用程序死鎖。

+0

感謝您的解決方案,但我仍然遇到同樣的問題。 方法 '公共任務連接(字符串userid,字符串密碼) {...}' 回報'tcs.task'without等待 'client.ExecuteAsync 執行(.. 。)' 所以結果總是爲空 – user2169047 2013-03-16 09:57:32

+1

是的,這正是它應該做的。如果你「等待」它,你只會得到一個結果。 – 2013-03-16 10:05:18

0

這看起來非常類似於周圍有許多人的問題:您不應該在執行WebRequest時進行阻塞(直接或間接地通過其他庫)。這似乎陷入僵局。避免這種情況。