正确使用调用

Proper use of invoke

我有一个关于调用用法的一般性问题。我的大多数 C# winforms 项目都有一个 backgroundworker,显然是 UI。很快我意识到我需要来自后台工作人员 UI 的信息,或者我需要更改来自后台工作人员的 UI 。 示例:

//example invoke usage to get information from UI (dateMatch = CheckBox, fromDate&toDate = Datepicker)
bool isDateMatch = false;
dateMatch.Invoke(new MethodInvoker(delegate { isDateMatch = dateMatch.Checked; }));
DateTime fromDt = new DateTime();
fromDate.Invoke(new MethodInvoker(delegate { fromDt = fromDate.Value; }));
DateTime toDt = new DateTime();
toDate.Invoke(new MethodInvoker(delegate { toDt = toDate.Value; }));
//example invoke usage to change UI (statusTxt = TextBox, progressBar = ProgressBar)
private void changeStatus(string statusTextV, bool enableProgressBar)
{
   statusTxt.Invoke(new MethodInvoker(delegate { statusTxt.Text = statusTextV; }));
   progressBar.Invoke(new MethodInvoker(delegate { progressBar.MarqueeAnimationSpeed = enableProgressBar ? 1 : 0; }));
}

我的意思是我的代码充满了调用方法。这是不是很糟糕,有更好的方法吗?

所有控件都将在 相同 UI 线程上 - 与表单本身相同,因此无需进行多次调用 - 而且您可以使用更简单的语法:

private void changeStatus(string statusTextV, bool enableProgressBar)
{
   Invoke((MethodInvoker)delegate {
        statusTxt.Text = statusTextV;
        progressBar.MarqueeAnimationSpeed = enableProgressBar ? 1 : 0; 
    });
}

你不应该一次又一次地做 Invoke,它可以一次完成 Invoke。关于正确使用 - 控件不是线程安全的,并且是在 UI 线程上创建的,因此您应该在 UI 线程中访问它们。

假设如果您在其他 UI 线程中访问控件,您将必须编写代码来处理同步并且必须锁定资源和所有资源。