繁体   English   中英

Method.Invoke()表现出奇怪的C#.NET BackgroundWorker

[英]Method.Invoke() behaving strangely C# .NET BackgroundWorker

我有以下代码,其中有一些细节:

private void bkgdProcessData_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    bkgdProcessData.ReportProgress(0);

    bool rdPickChecked = false;
    bool rdAutoChecked = true;
    int lbLengthsSelectedIndex = 0;
    string lbLengthsText = "";

    BeginInvoke(new MethodInvoker(() => {
        rdPickChecked = rdPick.Checked;
        rdAutoChecked = rdAuto.Checked;
        lbLengthsSelectedIndex = lbLengths.SelectedIndex;
        lbLengthsText = lbLengths.SelectedItem.ToString();
    }));

    if (rdPickChecked == true && e.Cancel == false)
    {
        if (lbLengthsSelectedIndex < 0)
        {
            ...
        }
        else if (SortedOrderedPieces[0].PieceLength > double.Parse(lbLengthsText))
        {
            ...
        }
        else
            ...
    }
    else if (rdAutoChecked == true && e.Cancel == false)
    {
        ...
    }
}

如您所见,整个过程就是BackgroundWorker。 我正在使用MethodInvoke()访问UI元素并将它们写入此过程中的变量。

我的问题是,当我在此过程的开始处放置一个断点并逐步执行时,它会正确设置变量并且程序可以正常运行, 但是如果我删除断点并仅运行它,则变量不会设置,并且程序不起作用。 我会以错误的方式处理吗?

您正在调用BeginInvoke ,它是异步的-它会在UI线程中执行给定的委托,但不会阻塞当前正在执行的线程...这意味着您很有可能最终会在其余部分中使用变量委托执行之前的方法。

一种解决方案是仅使用Invoke而不是BeginInvoke

另一个选择是启动BackgroundWorker 之前从UI中获取值,这样您就无需返回UI线程。 确切的操作方式取决于启动后台工作程序的方式和位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM