写在开头,本人第一次写博客。此文章让自己加深印象,方便后续自己遇到同样的问题。同事也给和我遇到一样问题的人提供下解决方案。刚入编程不久,如有错误处,欢迎各位大神指点。
最近在写客户进行信息交互式出现界面卡死的情况,查看日志是等待时间太长,客户服务器没有返回数据,用的是HttpWebRequest的timeout超时发现有时并不起作用,后面通过网上查找资料,找到两个超时退出函数的方法
1、创建线程,通过监控线程的等待时间去自动退出线程,继续运行
2、通过线程池任务监控运行超时
代码如下:
using System;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
public static ManualResetEvent mr = new ManualResetEvent(false);
static void Main(string[] args)
{
//方法一线程超时退出
mr.Reset();
Thread thread = new Thread(Method);
thread.Start();
bool bReceiveWait= mr.WaitOne(2000);//2000毫秒等待
if (!bReceiveWait)
{
thread.Abort();
Console.WriteLine("线程超时,终止线程");
}
else
Console.WriteLine("线程正常退出");
//方法二函数超时退出
bool bReceiveWait2;
Task tRun = Task.Run(() =>
{
Method();
});
bReceiveWait2 = tRun.Wait(2000);
if(!bReceiveWait2)
{
//tRun.Dispose(); 不能使用dispose释放正在运行的任务
Console.WriteLine("函数运行超时,跳过等待");
}
else
Console.WriteLine("函数运行正常");
Console.ReadLine();
}
static void Method()
{
for (int i = 0; i < 30; i++)
{
Thread.Sleep(100);
Console.WriteLine(i.ToString());
}
mr.Set();
}
}
}
第二种方法会出现当到达超时时间后会停止等待,继续运行主线程的代码。但是Method方法并不会终止,出现以下情况
第二种方法加入监控信号,提前退出函数,代码如下
using System;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
static void Main(string[] args)
{
//方法二函数超时退出
bool bReceiveWait2;
Task tRun = Task.Run(() =>
{
Method();
});
bReceiveWait2 = tRun.Wait(2000);
if(!bReceiveWait2)
{
//任务取消
tokenSource.Cancel();
Console.WriteLine("函数运行超时,跳过等待");
}
else
Console.WriteLine("函数运行正常");
Console.ReadLine();
}
static void Method()
{
for (int i = 0; i < 30; i++)
{
//检测任务是否已经被取消
if(tokenSource.IsCancellationRequested)
{
return;
}
Thread.Sleep(100);
Console.WriteLine(i.ToString());
}
}
}
}
目前找到的退出函数方法就这个,后续找到更好的方法再更新,也希望各位大神有什么好的方法教下我
第一种方法退出超市线程转载如有侵权请联系删除http://t.csdn.cn/CWyUA