【问题标题】:What is a simple way to add a timer to a method [duplicate]将计时器添加到方法的简单方法是什么[重复]
【发布时间】:2011-02-16 03:09:52
【问题描述】:

以下是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),从表面上看似乎非常好,因为这意味着能够一般地将超时添加到许多不同的方法调用,而不是专门绑定到一种类型的对象,但我怀疑它要么 i) 不可能,要么 ii ) 非常困难。

请帮忙。谢谢。

【问题讨论】:

  • 缺少编程语言。闻起来像 C#。你可以这样重新标记吗?

标签: c# timer asynchronous


【解决方案1】:

这是 Windows 还是 Web ?请重新标记。

如果是windows,为什么不使用Background Worker 在与主线程不同的线程中执行该方法?并使用进度条,例如让用户知道它正在工作......完成后,如果需要,提醒用户。

在 Web 中我会做同样的事情,只需将方法添加到一个全新的页面中,然后使用 jQuery,例如使用 $.get 来异步运行该方法

或者我错过了什么?


来自mwilson 的回答我认为你真的想强制超时而不是使用方法的内部超时/错误。

我不会删除我的答案,而是让它像有人可以使用的那样。

【讨论】:

  • 当您说“强制超时而不是使用内部超时/错误”时,您指的是什么? Tsiokos 的答案是一个例子吗?
【解决方案2】:

这应该会给你一个很好的起点。

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

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 2011-04-23
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2021-09-15
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多