In meiner Anwendung gibt es drei Themen wie:Eigenschaftswert festlegen, wenn alle Threads beendet sind?
private Thread _analysisThread;
private Thread _head2HeadThread;
private Thread _formThread;
und jeden Thread in der folgenden Art und Weise gestartet:
if (_analysisThread == null || !_analysisThread.IsAlive)
{
_analysisThread = new Thread(() => { Analysis.Logic(match); });
_analysisThread.Start();
}
ich ein Listview habe, wo der Benutzer ein Element auswählen und dann starten wieder der Thread, aber ich will dies verhindern, weil die Methoden innerhalb jedes Threads schwer sind, also brauchen Sie Zeit, um sie zu vervollständigen.
Bis jetzt will ich die ListView
Auswahl deaktivieren, so dass ich tat:
<ListView IsEnabled="{Binding IsMatchListEnabled}">
private bool _isMatchListEnabled = true;
public bool IsMatchListEnabled
{
get { return _isMatchListEnabled; }
set
{
_isMatchListEnabled = value;
OnPropertyChanged();
}
}
vor einem neuen Thread Start ich tun: IsMatchListEnabled = false;
aber was ich tun muss überprüfen, wenn alle Gewinde fertig sind und dann tun: IsMatchListEnabled = true;
, eigentlich, wenn ich die ListView
nach allen Thread aktivieren, bekomme ich die ListView
sogar aktiviert, weil der Thread
Code async ist, und der Code außerhalb der Thread
ist sync, so dass diese Eigenschaft tatsächlich nutzlos ist.
Was ich versucht, dies zu vermeiden, ist eine Endlosschleife wie folgt erstellen:
while (true)
{
if (!_analysisThread.IsAlive && !_head2HeadThread.IsAlive && !_formThread.IsAlive)
{
IsMatchListEnabled = true;
break;
}
}
diese Schleife, nachdem alle Fäden Ausführung gelegt wird, sondern wie man sich vorstellen kann, wird dies die Anwendung einfrieren. Irgendeine Lösung?
Verwenden Sie 'Task' statt Threads. "Task" bietet normale Möglichkeiten, auf den Abschluss zu warten. Du kannst das mit Threads machen, wenn du darauf bestehst, aber es gibt keinen Grund dazu. – Evk
@Evk das ist richtig, danke für den Hinweis: – jode
Sie schrieb Fire-and-Forgot-Thread-Code. Das kannst du fast nie vergessen. Verwenden Sie nicht Thread, verwenden Sie die praktischen Hilfsklassen, die Ihnen helfen, nicht zu vergessen. BackgroundWorker, Aufgabe, vielleicht async/warten. Und achten Sie darauf, dies zu lesen, wird Threading essen Sie am Leben und spucken Sie Ihre Knochen aus, wenn Sie es nicht gut genug verstehen. –