Trong ứng dụng của tôi có ba chủ đề như:Đặt giá trị thuộc tính khi tất cả các chuỗi kết thúc?
private Thread _analysisThread;
private Thread _head2HeadThread;
private Thread _formThread;
và mỗi thread được bắt đầu theo cách sau:
if (_analysisThread == null || !_analysisThread.IsAlive)
{
_analysisThread = new Thread(() => { Analysis.Logic(match); });
_analysisThread.Start();
}
Tôi đã một ListView nơi người dùng có thể chọn một mục và sau đó bắt đầu một lần nữa thread, nhưng tôi muốn ngăn chặn điều này 'vì các phương pháp bên trong mỗi thread là nặng, vì vậy cần thời gian để hoàn thành chúng.
Cho đến bây giờ tôi muốn vô hiệu hóa các lựa chọn ListView
, vì vậy tôi đã làm:
<ListView IsEnabled="{Binding IsMatchListEnabled}">
private bool _isMatchListEnabled = true;
public bool IsMatchListEnabled
{
get { return _isMatchListEnabled; }
set
{
_isMatchListEnabled = value;
OnPropertyChanged();
}
}
trước một sự khởi đầu mới Chủ đề tôi làm: IsMatchListEnabled = false;
nhưng những gì tôi cần làm là kiểm tra xem tất cả các chủ đề đã kết thúc và sau đó làm: IsMatchListEnabled = true;
, trên thực tế nếu tôi bật ListView
sau tất cả chuỗi, tôi nhận được ListView
thậm chí được bật vì mã Thread
không đồng bộ và mã bên ngoài Thread
được đồng bộ hóa, vì vậy thực sự thuộc tính này là vô dụng.
Những gì tôi đã cố gắng để tránh điều này là tạo ra một vòng lặp vô hạn như thế này:
while (true)
{
if (!_analysisThread.IsAlive && !_head2HeadThread.IsAlive && !_formThread.IsAlive)
{
IsMatchListEnabled = true;
break;
}
}
vòng lặp này được đặt sau khi tất cả chủ đề thực hiện, nhưng khi bạn có thể tưởng tượng, điều này sẽ đóng băng các ứng dụng. Bất kỳ giải pháp nào?
Sử dụng 'Tác vụ thay vì chuỗi. 'Task' cung cấp các cách bình thường để chờ hoàn thành. Bạn _can_ làm điều đó với Threads nếu bạn nhấn mạnh, nhưng không có nhiều lý do để. – Evk
@Evk đúng, cảm ơn gợi ý: – jode
Bạn đã viết mã chuỗi bị cháy và quên. Bạn gần như không bao giờ quên được. Không sử dụng Thread, sử dụng các lớp helper tiện lợi giúp bạn không quên. BackgroundWorker, Task, có lẽ không đồng bộ/đang chờ. Và chắc chắn để đọc về điều này, luồng sẽ ăn bạn sống và nhổ xương của bạn khi bạn không hiểu nó đủ tốt. –