tôi sử dụng một BackgroundWorker và làm điều này:Tại sao tôi không nhận được "hoạt động Chữ thập sợi không hợp lệ" lỗi
private void loadNewAsyncToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Text = "RunWorkerAsync()";
backgroundWorkerLoading.RunWorkerAsync();
}
private void backgroundWorkerLoading_DoWork(object sender, DoWorkEventArgs e)
{
UnsafeThreadMethod("hello");
EvenUnsaferThreadMethod();
}
Và bây giờ là hai phương pháp.
private void UnsafeThreadMethod(string text)
{
toolStripLabelRssFeedData.Text = text;
}
private void EvenUnsaferThreadMethod()
{
panelLoading.Visible = true;
}
Tôi không hiểu tại sao UnsafeThreadMethod
không ném ngoại lệ sau nhưng EvenUnsaferThreadMethod
làm.
Hoạt động trên luồng không hợp lệ: Kiểm soát 'panelLoading' được truy cập từ một chủ đề không phải là> chuỗi được tạo trên đó.
Theo thông báo là vì toolStripLabelRssFeedData
được tạo trên cùng một chuỗi nhưng không phải.
Tôi nghĩ rằng tôi không thể gọi các điều khiển được tạo bởi chuỗi chính và phải sử dụng sự kiện ProgressChanged
. Chuyện gì vậy?
Và tôi có câu hỏi thứ hai. Lợi thế của việc làm như thế này khi tôi có thể sử dụng ProgressChanged
là gì? Tôi nên làm gì?
private void EvenUnsaferThreadMethod()
{
if (panelLoading.InvokeRequired)
{
panelLoading.Invoke(new MethodInvoker(() => { EvenUnsaferThreadMethod(); }));
}
else
{
panelLoading.Visible = true;
}
}
Tôi nghĩ câu trả lời này giải quyết những gì OP hỏi là lý do tại sao cuộc gọi không an toàn rõ ràng không phải là một ngoại lệ. Tất cả đều xoay quanh thực tế rằng ToolStripLabel không lấy được từ Control và không kiểm tra sự an toàn của luồng. Nó chỉ xảy ra để làm việc, nhưng như người khác đã chỉ ra, bạn không thể tin vào điều đó để ở lại sự thật mãi mãi. –