Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向方法添加计时器的简单方法是什么_C#_Timer_Asynchronous - Fatal编程技术网

C# 向方法添加计时器的简单方法是什么

C# 向方法添加计时器的简单方法是什么,c#,timer,asynchronous,C#,Timer,Asynchronous,下面是C# 我正在尝试做一些非常简单的事情(我想)。我有一个加载XML文档的方法 XDocument doc = XDocument.Load(uri); ,但如果存在问题(连接性、文档大小等),我不想占用pc资源 因此,我希望能够添加一个timeout变量,该变量将在给定的秒数后切断该方法。当谈到异步编程时,我是一个新手,我发现有这么多的例子以这么多不同的方式编写,这让我感到困惑。而且没有一个看起来简单。如果可能的话,我想要一个简单的解决方案 到目前为止,我对可能的解决途径有以下想法: (

下面是C#

我正在尝试做一些非常简单的事情(我想)。我有一个加载XML文档的方法

XDocument  doc = XDocument.Load(uri);
,但如果存在问题(连接性、文档大小等),我不想占用pc资源

因此,我希望能够添加一个timeout变量,该变量将在给定的秒数后切断该方法。当谈到异步编程时,我是一个新手,我发现有这么多的例子以这么多不同的方式编写,这让我感到困惑。而且没有一个看起来简单。如果可能的话,我想要一个简单的解决方案

到目前为止,我对可能的解决途径有以下想法:

(一) 包装现有负载的方法

public XDocument LoadXDocument(string uri, int timeout){ //code }
(二) 包装器,但作为扩展方法

XDocument doc = XDocument.LoadWithTimeout(string uri, int timeout);
(三) 通用扩展方法

Object obj = SomeStaticClass.LoadWithTimeout(??? method, int timeout);
3) ,从表面上看,它似乎真的很好,因为这意味着能够为许多不同的方法调用添加超时,而不是专门绑定到一种类型的对象,但我怀疑这要么是I)不可能的,要么是ii)非常困难的


请帮忙。谢谢。

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

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

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

或者我错过了什么


mwilson
回答中,我认为您希望真正强制超时,而不是使用该方法的内部超时/错误


我不会删除我的答案,而是让别人使用它。

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

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

缺少编程语言。闻起来像C。你能这样重新标记吗?当你说“强制超时而不是使用内部超时/错误”时,你指的是什么?齐奥科斯的回答就是一个例子吗?