首页 / C# / c# – 所有线程完成后设置属性值?
c# – 所有线程完成后设置属性值?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 所有线程完成后设置属性值?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2122字,纯文字阅读大概需要4分钟。
内容图文
![c# – 所有线程完成后设置属性值?](/upload/InfoBanner/zyjiaocheng/789/c69617bcdab94109b7bbccda1de24ad4.jpg)
在我的应用程序中有三个线程,如:
private Thread _analysisThread;
private Thread _head2HeadThread;
private Thread _formThread;
每个线程以下列方式启动:
if (_analysisThread == null || !_analysisThread.IsAlive)
{
_analysisThread = new Thread(() => { Analysis.Logic(match); });
_analysisThread.Start();
}
我有一个ListView,用户可以在其中选择一个项目,然后重新开始该线程,但我希望防止这种情况,因为每个线程内的方法都很重,所以需要时间来完成它们.
到现在为止我想要禁用ListView选项,所以我做了:
<ListView IsEnabled="{Binding IsMatchListEnabled}">
private bool _isMatchListEnabled = true;
public bool IsMatchListEnabled
{
get { return _isMatchListEnabled; }
set
{
_isMatchListEnabled = value;
OnPropertyChanged();
}
}
在新线程启动之前我做了:IsMatchListEnabled = false;但我需要做的是检查是否所有线程都已完成然后执行:IsMatchListEnabled = true;,实际上如果我在所有线程之后启用ListView,我得到ListView甚至启用’因为Thread代码是异步的,并且代码在外面线程是同步的,所以实际上这个属性是无用的.
我试图避免这种情况是创建一个像这样的无限循环:
while (true)
{
if (!_analysisThread.IsAlive && !_head2HeadThread.IsAlive && !_formThread.IsAlive)
{
IsMatchListEnabled = true;
break;
}
}
在所有线程执行之后放置此循环,但是您可以想象,这将冻结应用程序.
有解决方案吗
解决方法:
所有评论都是正确的 – 最好使用任务.只是回答OP的问题.
您可以使用ManualResetEvent同步线程,通过线程数创建一个事件数组,并在完成所有线程时更改IsMatchListEnabled.
public static void SomeThreadAction(object id)
{
var ev = new ManualResetEvent(false);
events[id] = ev; // store the event somewhere
Thread.Sleep(2000 * (int)id); // do your work
ev.Set(); // set the event signaled
}
然后,在其他地方我们需要初始化等待例程.
// we need tokens to be able to cancel waiting
var cts = new CancellationTokenSource();
var ct = cts.Token;
Task.Factory.StartNew(() =>
{
bool completed = false;
while (!ct.IsCancellationRequested && !completed)
{
// will check if our routine is cancelled each second
completed =
WaitHandle.WaitAll(
events.Values.Cast<ManualResetEvent>().ToArray(),
TimeSpan.FromSeconds(1));
}
if (completed) // if not completed, then somebody cancelled our routine
; // change your variable here
});
完整示例可以在here找到并查看.
内容总结
以上是互联网集市为您收集整理的c# – 所有线程完成后设置属性值?全部内容,希望文章能够帮你解决c# – 所有线程完成后设置属性值?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。