2014-04-17 38 views
2

我正在使用Windows Phone 7.1應用程序,並希望多行代碼運行10秒,如果在10秒內成功,請繼續,如果沒有成功,請停止代碼並顯示消息。 問題是,我的代碼不是循環 - 手機試圖從服務器獲取數據(如果互聯網連接速度慢,可能需要很長時間)。讓代碼運行X秒,之後停止

if (DeviceNetworkInformation.IsNetworkAvailable) 
{ 
    // start timer here for 10s 
    WebClient webClient = new WebClient(); 
    webClient.DownloadStringCompleted += loginHandler; 
    webClient.DownloadStringAsync(new Uri(string.Format(url + "?loginas=" + login + "&pass=" + pwd))); 
    // if 10s passed, stop code above and display MessageBox 
} 
+0

這些都可以用於指示啓動和結束日期: DateTime start = DateTime.Now ; //代碼 (DateTime.Now - start).TotalSeconds> = 10 但不知道如何停止代碼,因爲它不是一個循環 –

回答

3

您可以使用類似以下內容:

HttpClient client = new HttpClient(); 

var cts = new CancellationTokenSource(); 
cts.CancelAfter(10000); 

try 
{ 
    var response = await client.GetAsync(new Uri(string.Format(url + 
      "?loginas=" + login + "&pass=" + pwd)), cts.Token); 
    var result = await response.Content.ReadAsStringAsync(); 
    // work with result 
} 
catch(TaskCanceledException) 
{ 
    // error/timeout handling 
} 

您需要follwoing的NuGet包:

+0

這需要一點修改才能在WP7.1上工作:[async await task.run - not found](http://stackoverflow.com/questions/15724051/async-await-task-run-not-found) – har07

+0

工作 - 給我幾分鐘,我會更新我的答案... – ChrFin

+0

''System.Threading.Tasks.Task'不包含'延遲'的定義#' ''System.Threading.Tasks.Task '不包含'運行'的定義 當前上下文中不存在「客戶端」名稱 **如果我將客戶端更改爲我使用的webClient,則代之以:** ''' System.Net.WebClient'不包含'GetStringAsync'的定義,並且沒有找到接受'System.Net.WebClient'類型的第一個參數的擴展方法'GetStringAsync'(你是否缺少使用指令或程序集引用? )' –

2

使這段代碼成爲一種方法,使該方法單獨運行。 啓動一個計時器,經過10秒後,檢查第一個線程的狀態。 如果它已經提取了所有他應該使用的內容,請使用該內容,否則殺死線程,清理您必須清理的任何內容並返回錯誤消息。

+0

在這種情況下,無論如何它將運行10秒。如果在10s以內取得數據成功,那麼定時器應該停止,並且 –

+1

在這種情況下,如果方法在10秒之前成功,你可以設置一個回調函數,它會返回結果並停止定時器。 –