2010-05-05 70 views
0

以下是在C#中。什麼是簡單的方法來添加一個計時器的方法

我試圖做一些非常簡單的事情(我認爲)。我有一個加載XML文檔

XDocument doc = XDocument.Load(uri); 

的方法,但我不想佔用電腦資源,如果有問題(連接,文件大小等)。

所以我想能夠添加一個超時變量,將在給定的秒數後關閉該方法。當談到異步編程時,我是一個新手,並且發現很多例子寫了很多不同的方式,讓人感到困惑。 。 。並沒有一個看起來很簡單。如果可能,我想要一個簡單的解決方案。

這是我的想法到目前爲止上可行的解決方案的路徑:

1) 封裝了現有負載

public XDocument LoadXDocument(string uri, int timeout){ //code } 

2) 一個包裝的方法,但作爲一個擴展方法

XDocument doc = XDocument.LoadWithTimeout(string uri, int timeout); 

3) 通用擴展方法。

Object obj = SomeStaticClass.LoadWithTimeout(??? method, int timeout); 

3),它的臉上似乎真的很好,因爲這意味着能夠一般超時添加到許多不同的方法調用,而不是特別依賴於一個類型的對象,但我懷疑這是任我)不可能或者ii)非常困難。

請協助。謝謝。

+0

缺少編程語言。聞起來像C#。你能重新如此嗎? – BalusC 2010-05-05 21:01:07

回答

0

這是Windows還是Web?請重新登錄。

如果windows,爲什麼不使用Background Worker在與主函數不同的線程中執行該方法?並使用進度條例如讓用戶知道它正在工作......完成後,在需要時提醒用戶。

在網絡我會做同樣的事情,只需添加方法進入一個全新的頁面,然後使用jQuery例如,使用$.get運行的方法異步

或者我失去了一些東西?


mwilson答案,我想你想真正強制超時,而不是使用方法的內部超時/錯誤。

而不是刪除我的答案我會讓它成爲有人可以使用它。

+0

當你說「強制超時而不是使用內部超時/錯誤」時,你指的是什麼? Tsiokos的答案是一個例子嗎? – John 2010-05-05 21:46:06

0

這應該給你一個很好的起點。

public static XDocument GetDoc(string uri, int timeout) 
{ 
    var result = default(XDocument); 
    { 
     using (var client = new WebClient()) 
     using (var complete = new ManualResetEvent(false)) 
     { 
      client.DownloadStringCompleted += (sender, e) => 
      { 
       try 
       { 
        if (!e.Cancelled) 
        { 
         result = XDocument.Parse(e.Result); 
        } 
       } 
       finally 
       { 
        complete.Set(); 
       } 
      }; 

      client.DownloadStringAsync(new Uri(uri)); 
      Thread.Sleep(timeout); 
      if (!complete.WaitOne(1)) 
      { 
       client.CancelAsync(); 
      } 
      complete.WaitOne(); 
     } 
    } 
    return result; 
} 
相關問題