c# – 暂停/恢复线程的这两种方法有什么区别?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 暂停/恢复线程的这两种方法有什么区别?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2937字,纯文字阅读大概需要5分钟。
内容图文
![c# – 暂停/恢复线程的这两种方法有什么区别?](/upload/InfoBanner/zyjiaocheng/786/d3e1e742003e4bab9a01bba162503778.jpg)
我有一个多线程应用程序,用于从网站中提取数据.我希望能够从UI暂停和恢复多个线程.在网上搜索后,我了解了两种可用于控制(暂停/恢复)线程的方法.
>使用Monitor课程.
>使用EventWaitHandle和ManualResetEvent课程.
我做了什么:
我有一个名为GetHtml的函数,它只返回网站的html.为简洁起见,我只是展示了这个功能的一小部分.
public string GetHtml(string url, bool isProxy = false)
{
string result = "";
ExecutionGateway();
//->> EXTRA CODE FOR FETCHING HTML
return result;
}
我有一个函数ControlTask??s用于从UI控制线程,下面我已经使用Monitor类和EventWaitHandle类使用两种线程控制方法解释了ControlTask??s函数(我还将简要解释函数Exec??utionGateway的工作).
1.使用Monitor类
private object taskStopper = new object();
public bool ControlTasks(bool isPause)
{
try
{
if (isPause)
{
Monitor.Enter(taskStopper);
}
else
{
Monitor.Exit(taskStopper);
}
return true;
}
catch (Exception ex)
{
Logger.Instance.WriteLog("ControlTasks:", ex, Logger.LogTypes.Error);
return false;
}
}
从UI调用ControlTask??s,如果isPause为true,则在对象taskStopper上使用独占锁,否则释放锁.现在,函数Exec??utionGateway用于获取对象taskStopper的锁,但它不执行任何操作,如下面的代码所示.
private void ExecutionGateway()
{
lock(taskStopper){ }
}
这样,当ControlTask??s中isPause为true时,所有正在运行的线程都进入等待状态,因为taskStopper是独占锁定的,如果isPause为false,则所有线程都会恢复其处理.
2.使用EventWaitHandle类
private EventWaitHandle handle = new ManualResetEvent(true);
public bool ControlTasks(bool isPause)
{
try
{
if (isPause)
{
handle.Reset();
}
else
{
handle.Set();
}
return true;
}
catch (Exception ex)
{
Logger.Instance.WriteLog("ControlTasks:", ex, Logger.LogTypes.Error);
return false;
}
}
此代码也从根本上执行相同的工作,其中事件状态根据isPause参数发出信号/不发信号.现在,相应的ExecutionGateway方法.
private void ExecutionGateway()
{
handle.WaitOne(Timeout.Infinite);
}
问题:
>这两种方法有什么区别,一种比另一种更好?有没有其他方法可以做到这一点?
>我多次面临的主要问题是,如果我使用上述方法中的任何一种,并且我有100个线程;当我暂停它们,然后在5分钟或更长时间后恢复它们,UI开始挂起.用户界面非常反应迟钝.它会得到更新但仍然保持挂起状态,并且每隔一段时间我就会收到“无响应”消息.有一件事我想提到每个线程提取数据并通知UI有关通过事件处理获取的数据.这种反应迟钝的原因是什么?这是我的方法的问题吗?
解决方法:
我认为总是希望使用一种能够清楚地传达你意图的结构.你想要一个他们应该等待的其他线程的信号(即停止做他们正在做的事情),直到你发信号通知他们可以重新开始.您有一个控制线程(您的UI),并且可能有许多线程正在进行工作并将结果编组回UI.
方法1并不理想,因为锁(至少在我的经验中)最常用于保护不适合在多线程代码中使用的资源.例如,写入共享字段.
方法2更有意义,手动重置事件就像一个门:打开门,事物可以通过,关闭它,他们不能.这正是您正在寻找的行为,我认为大多数开发人员会很快理解这是您的意图.
至于你的第二个问题,听起来你正在收到阻塞UI的消息.如果你停止所有100个线程然后同时启动它们,那么他们很可能会完全靠近地完成他们的工作,并且所有人都试图将他们的工作结果发送到UI线程.要解决此问题,您可以尝试在重新启动或使用较少线程时错开工作.另一种选择是聚合结果,并且每x秒只调度一次UI – 但这样做更多一些.
内容总结
以上是互联网集市为您收集整理的c# – 暂停/恢复线程的这两种方法有什么区别?全部内容,希望文章能够帮你解决c# – 暂停/恢复线程的这两种方法有什么区别?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。