0

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

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 元素并将它们写入此过程中的变量。

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

4

1 回答 1

1

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

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

另一种选择是在启动之前从 UI 中获取值,这样BackgroundWorker您就不需要返回到 UI 线程。您将如何执行此操作将取决于您启动后台工作程序的方式和位置。

于 2013-10-18T13:10:16.700 回答