Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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/0/asp.net-mvc/15.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#_Exception_Timeout_Sleep_Wait - Fatal编程技术网

C# 如果方法花费的时间太长而无法完成,则超时

C# 如果方法花费的时间太长而无法完成,则超时,c#,exception,timeout,sleep,wait,C#,Exception,Timeout,Sleep,Wait,我正在尝试超时,并在等待指定的时间后抛出异常,我想知道我目前的做法是否是最好的 类超时 { xml文档文档; 系统对象输入; 公共超时(XmlDocument文档,系统对象输入) { this.doc=doc; 这个输入=输入; } 公开募捐 { if(输入为流) { 单据加载((流)输入); } else if(输入为XmlReader) { 文档加载((XmlReader)输入); } else if(输入为TextReader) { 单据加载((文本阅读器)输入); } 其他的 { 单据加

我正在尝试超时,并在等待指定的时间后抛出异常,我想知道我目前的做法是否是最好的

类超时
{
xml文档文档;
系统对象输入;
公共超时(XmlDocument文档,系统对象输入)
{
this.doc=doc;
这个输入=输入;
}
公开募捐
{
if(输入为流)
{
单据加载((流)输入);
}
else if(输入为XmlReader)
{
文档加载((XmlReader)输入);
}
else if(输入为TextReader)
{
单据加载((文本阅读器)输入);
}
其他的
{
单据加载((字符串)输入);
}
System.Threading.Thread.CurrentThread.Abort();
}
}
私有void LoadXmlDoc(XmlDocument文档,系统对象输入)
{
超时=新超时(单据,输入);
System.Threading.Thread timeoutThread=新的System.Threading.Thread(新的ThreadStart(timeout.run));
timeoutThread.Start();
System.Threading.Thread.Sleep(this.timeout*1000);
if(timeoutThread.IsAlive)
{
抛出新的DataSourceException(“达到超时”,timeout.GetHashCode());
}
}
当前的方法确实有效,所以我只是想知道是否有更简单/更好的方法来完成同样的事情。

除了我的评论(),这里是关于线程的。基本上可以归结为学习不同的设计/库,它们的优缺点是什么,哪一个最适合您的需要

根据我的理解,并且希望有人对这个主题有更多的了解,你可以将线程设计分为两类,同步和异步。您已经使用了异步设计,使用了线程池。如果您想坚持这种设计,可以尝试使用
任务
或同步操作
并行


另一方面:我不确定使用异常处理简单逻辑背后的智慧。换句话说,
异常可以简单地替换为返回一个
布尔值

try
{
    var cts = new System.Threading.CancellationTokenSource();

    cts.CancelAfter(TimeSpan.FromSeconds(0.01));

    var tw = Task.Run<System.Xml.XmlDocument>(() =>
    {
        var doc = new System.Xml.XmlDocument();
        doc.Load("https://maps.googleapis.com/maps/api/geocode/xml?address=1+Exchange+Plaza+,+Floor+26+,+NY&sensor=false");
        return doc;
    }, cts.Token);

    var xml = await tw;
}
catch (TaskCanceledException e)
{

}
试试看
{
var cts=new System.Threading.CancellationTokenSource();
cts.CancelAfter(时间跨度从秒开始(0.01));
var tw=Task.Run(()=>
{
var doc=new System.Xml.XmlDocument();
文件加载(“https://maps.googleapis.com/maps/api/geocode/xml?address=1+交易所+广场+,+楼层+26+,+NY和传感器=假“;
退货单;
},cts.Token);
var xml=等待tw;
}
捕获(TaskCanceledException e)
{
}
我最终做了什么:

类超时
{
xml文档文档;
系统对象输入;
公共超时(XmlDocument文档,系统对象输入)
{
this.doc=doc;
这个输入=输入;
}
公开募捐
{
if(输入为流)
{
单据加载((流)输入);
}
else if(输入为XmlReader)
{
文档加载((XmlReader)输入);
}
else if(输入为TextReader)
{
单据加载((文本阅读器)输入);
}
其他的
{
单据加载((字符串)输入);
}
}
}
私有void LoadXmlDoc(XmlDocument文档,系统对象输入)
{
超时=新超时(单据,输入);
System.Threading.Thread timeoutThread=新的System.Threading.Thread(新的ThreadStart(timeout.run));
timeoutThread.Name=“XmlWorker”+threadNumber++;
timeoutThread.Start();
如果(!timeoutThread.Join(this.timeout))//Join返回false表示已达到超时
{
if(timeoutThread.IsAlive)
timeoutThread.Abort();
抛出新的DataConnectionException(“达到超时:+this.timeout.millides+“ms”,新的TimeoutException(this.timeout.millides));
}
}
我发现了一件事。基本上,您不需要在
run()
中中止线程。它将抛出异常,而不是完成线程。哦,除此之外,我真的不知道还有什么可以改变的。