在我的应用程序中,有三个线程:
private Thread _analysisThread;
private Thread _head2HeadThread;
private Thread _formThread;
每个线程的启动方式如下:
if (_analysisThread == null || !_analysisThread.IsAlive)
{
_analysisThread = new Thread(() => { Analysis.Logic(match); });
_analysisThread.Start();
}
我有一个ListView,用户可以选择其中的一个项目并重新启动线程,但我想防止这种情况发生,因为每个线程中的方法都很耗费时间,需要一些时间才能完成。
到目前为止,我希望禁用ListView的选择功能,所以我做了以下操作:
```Java listView.setEnabled(false); ```
<ListView IsEnabled="{Binding IsMatchListEnabled}">
private bool _isMatchListEnabled = true;
public bool IsMatchListEnabled
{
get { return _isMatchListEnabled; }
set
{
_isMatchListEnabled = value;
OnPropertyChanged();
}
}
在启动新线程之前,我会执行以下操作:IsMatchListEnabled = false;
但是我需要检查所有线程是否都已完成,然后才执行 IsMatchListEnabled = true;
。如果在所有线程完成之后启用 ListView
,由于 Thread
代码是异步的,而 Thread
之外的代码是同步的,因此实际上此属性是无用的。
为了避免这种情况,我尝试创建一个无限循环,如下所示:
while (true)
{
if (!_analysisThread.IsAlive && !_head2HeadThread.IsAlive && !_formThread.IsAlive)
{
IsMatchListEnabled = true;
break;
}
}
这个循环放在所有线程执行之后,但是你可以想象,这会冻结应用程序。 有什么解决办法吗?
Task
而非线程(Thread
)来执行任务,Task
提供了等待任务完成的正常方式。如果你坚持使用线程也可以实现等待任务完成,但实际上并没有太多理由这样做。 - Evk