2010-05-05 32 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; 
} 
相关问题