正确使用调用
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 线程中访问控件,您将必须编写代码来处理同步并且必须锁定资源和所有资源。
我有一个关于调用用法的一般性问题。我的大多数 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 线程中访问控件,您将必须编写代码来处理同步并且必须锁定资源和所有资源。