Tôi đặt cùng nhau (tôi nghĩ) thực hiện công việc. Xin vui lòng cho tôi biết nếu im waaaay off. Dưới đây là một exaple đơn giản như thế nào nó hoạt động.
var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};
backgroundWorker.DoWork += (sender, args) =>
{
var thisWorker = sender as BackgroundWorker;
var _child = new Thread(() =>
{
//..Do Some Code
});
_child .Start();
while (_child.IsAlive)
{
if (thisWorker.CancellationPending)
{
_child.Abort();
args.Cancel = true;
}
Thread.SpinWait(1);
}
};
backgroundWorker.RunWorkerAsync(parameter);
//..Do Something...
backgroundWorker.CancelAsync();
Vì công nhân nền là một phần của nhóm chủ đề, chúng tôi không muốn hủy bỏ nó. Nhưng chúng ta có thể chạy một chuỗi nội bộ mà chúng ta có thể cho phép một sự hủy bỏ xảy ra. BackgroundWorker sau đó về cơ bản chạy cho đến khi một trong hai chủ đề con hoàn thành hoặc chúng tôi báo hiệu cho nó để giết quá trình. Chuỗi công nhân nền sau đó có thể quay trở lại nhóm đọc. Thông thường tôi sẽ quấn nó lên trong một lớp trợ giúp và chuyển qua phương thức ủy nhiệm mà tôi muốn luồng nền chạy qua như tham số và chạy nó trong chuỗi con.
Hãy cho ai đó biết nếu tôi đập đầu vào tường nhưng nó có vẻ hoạt động tốt .. Nhưng đó là vấn đề với chủ đề không phải là .. các kết quả khác nhau bạn có thể nhận được khi bạn chạy nó vào các thời điểm khác nhau.
tôi đã tìm thấy SerialPort.DataReceived là một chút bối rối trong CF, không biết nếu impl là tốt hơn trong FF. Một CF sử dụng nhiều chủ đề hơn bạn mong đợi để xem ra. – Quibblesome
Hầu như bị cám dỗ với -1 cho nhận xét về BackgroundWorker; nó được thiết kế để thực thi một số tiêu chuẩn và các sự kiện sắp xếp tự động vào luồng giao diện người dùng, đó là các lý do hợp lệ cho việc sử dụng nó; không hiểu luồng sẽ gây ra vấn đề không có vấn đề gì theo cách bạn đi. –
Trừ khi có một cách dễ dàng hơn để đồng bộ hóa với chuỗi giao diện người dùng từ một chuỗi bình thường ... – Glimpse