小编pel*_*elz的帖子

为什么我没有得到"跨线程操作无效"错误

我使用BackgroundWorker并执行此操作:

private void loadNewAsyncToolStripMenuItem_Click(object sender, EventArgs e)
{
    this.Text = "RunWorkerAsync()";
    backgroundWorkerLoading.RunWorkerAsync();
}
private void backgroundWorkerLoading_DoWork(object sender, DoWorkEventArgs e)
{
    UnsafeThreadMethod("hello");
    EvenUnsaferThreadMethod();
}
Run Code Online (Sandbox Code Playgroud)

而现在这两种方法.

private void UnsafeThreadMethod(string text)
{
    toolStripLabelRssFeedData.Text = text;
}

private void EvenUnsaferThreadMethod()
{
    panelLoading.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么UnsafeThreadMethod不抛出以下异常,但EvenUnsaferThreadMethod确实如此.

跨线程操作无效:控制'panelLoading'从其创建的>线程以外的线程访问.

根据消息,因为toolStripLabelRssFeedData它是在同一个线程上创建的,但事实并非如此.

我以为我不能调用主线程创建的控件并且必须使用该ProgressChanged事件.这是怎么回事?

我还有第二个问题.当我可以使用时,这样做有什么好处ProgressChanged?我该怎么办?

private void EvenUnsaferThreadMethod()
{
    if (panelLoading.InvokeRequired)
    {
        panelLoading.Invoke(new MethodInvoker(() => { EvenUnsaferThreadMethod(); }));
    }
    else
    {
        panelLoading.Visible = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading exception-handling winforms

5
推荐指数
1
解决办法
1089
查看次数

标签 统计

.net ×1

c# ×1

exception-handling ×1

multithreading ×1

winforms ×1