开发者

What is a simple way to add a timer to a method [duplicate]

This question already has answers here: Implement C# Generic Timeout (7 answers) 开发者_JAVA技巧 Closed 8 years ago.

The following is in C#.

I'm trying to do something very simple (I think). I have a method that loads an XML document

XDocument  doc = XDocument.Load(uri);

, but I don't want to tie up pc resources if there are issues (connectivity, document size, etc.).

So I'd like to be able to add a timeout variable that will cut the method off after a given number of seconds. I'm a newbie when it comes to asynchronous programming and find it confusing that there are so many examples written so many different ways . . . and none of them appear simple. I'd like a simple solution, if possible.

Here's my thoughts so far on possible solution paths:

1) A method that wraps the existing load

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

2) A wrapper, but as an extension method

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

3) A generic extension method.

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

3), on its face seems really nice, because it would mean being able to generically add timeouts to many different method calls and not specifically tied to one type of object, but I suspect that it is either i)impossible or ii) very difficult.

Please assist. Thanks.


is this Windows or Web ? Please retag.

If windows, why don't you use a Background Worker for executing that method in a different thread than the main one? and use a progress bar for example to let user know that it is working... when done, alert the user if needed.

in Web I would do the same thing, just add the method into a brand new page and then using jQuery for example, use $.get to run the method asynchronously

or I'm missing something?


from mwilson answer I think you want to really force a timeout rather than use the internal timeout/error of the method.

Rather than delete my answer I will let it be as someone could use it.


This should give you a nice starting point.

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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜