- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
设置:带有进度条和标签的主 MDI 窗体。
主窗体中的代码。
public delegate void UpdateMainProgressDelegate(string message, bool isProgressBarStopped);
private void UpdateMainProgress(string message, bool isProgressBarStopped)
{
// make sure we are running on the right thread to be
// updating this form's controls.
if (InvokeRequired == false)
{
// we are running on the right thread. Have your way with me!
bsStatusMessage.Caption = message + " [ " + System.DateTime.Now.ToShortTimeString() + " ]";
progressBarStatus.Stopped = isProgressBarStopped;
}
else
{
// we are running on the wrong thread.
// Transfer control to the correct thread!
Invoke(new ApplicationLevelValues.UpdateMainProgressDelegate(UpdateMainProgress), message, isProgressBarStopped);
}
}
子表单
private readonly ApplicationLevelValues.UpdateMainProgressDelegate _UpdateMainForm;
private void btnX_Click(object sender, EventArgs e)
{
_UpdateMainForm.BeginInvoke("StartA", false, null, null);
try
{
if(UpdateOperationA())
{ _UpdateMainForm.BeginInvoke("CompletedA", true, null, null); }
else
{ _UpdateMainForm.BeginInvoke("CanceledA", true, null, null); }
}
catch (System.Exception ex)
{
_UpdateMainForm.BeginInvoke("ErrorA", true, null, null);
throw ex;
}
}
它工作得很好,但是对于 N 个按钮或 N 个操作,我必须一次又一次地编写相同的代码。有没有什么方法可以将其推广或有任何其他更好的方法来更新 UI。
最佳答案
如果您的操作都可以表示为单个委托(delegate)类型,那么这实际上只是一个简单的重构问题。例如:
private void RunOperationWithMainProgressFeedback(
Func<bool> operation,
string startMessage,
string completionMessage,
string cancellationMessage,
string errorMessage)
{
this._UpdateMainForm.BeginInvoke(startMessage, false, null, null);
try
{
if (operation.Invoke())
{
this._UpdateMainForm.BeginInvoke(completionMessage, true, null, null);
}
else
{
this._UpdateMainForm.BeginInvoke(cancellationMessage, true, null, null);
}
}
catch (Exception)
{
this._UpdateMainForm.BeginInvoke(errorMessage, true, null, null);
throw;
}
}
private void btnX_Click(object sender, EventArgs e)
{
this.RunOperationWithMainProgressFeedback(
this.UpdateOperationA,
"StartA",
"CompletedA",
"CanceledA",
"ErrorA");
}
虽然可以使用字典来存储参数值(如 VinayC 先前的回答中所建议的),但这不是必需的。就个人而言,出于可读性和性能方面的原因,我会避免使用它,但是 ymmv...
关于c# - Winforms 异步更新 UI 模式 - 需要概括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3582140/
我正在寻找一种简单的方法来编写函数 mapAndUnzip :: (Functor f) => (a -> (b,c)) -> f a -> (f b, f c) 我并不完全相信 Functor是一个
我的代码是这样的: if(country == china) { getCNData(); } else { getDefaultDataForallCountries(); } 现在我需要为其他国家
在处理使用类型类模式的 Scala 项目时,我遇到了语言如何实现模式的严重问题:由于 Scala 类型类实现必须由程序员而不是语言管理,因此任何变量属于一个类型类永远不会被注解为父类型,除非它的类型类
我正在尝试在 R 中创建一个公式,其形式为 输出~Var1+Var2+Var3 用于模型。它的工作方式似乎是你给你想要预测的变量名,波浪号,你想用作预测变量的变量名,然后在后面的参数中你给出包含这些变
我正在使用一堆类型的宏: #define Q31_TO_Q30 (31-30) #define Q31_TO_Q20 (31-20) #define Q25_TO_Q15 (25-15) etc. 我
为了提高工作效率,我使用以下函数来了解我必须为哪些函数设置别名,因为我最常使用它们: function mu() { if [[ $# -eq 0 ]]; then histo
我有几个文本框。我想在每次按下回车键时将用户指向下一个文本框。文本框已正确设置 Tabindex。 我有这样的东西: private void textBox_Description_KeyPres
有什么方法可以将列约束应用于我的所有 GridPanes 列。我有各种 GridPane 控件,我希望它们共享以下列约束: 可以用css来实现吗? 编辑 我最终做了这样的事情。但它不起作用(我的列宽
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我正在做一个 JavaScript 游戏作业,只是尝试玩一下 Canvas 。我的任务是使用激光源、镜子和目标物体进行激光游戏。 我刚刚做了一个丑陋的硬编码示例: 'use strict'; func
我正在尝试从任何公共(public) REST API 获取响应并对其进行处理(解析并放入数据结构)。从 API 获取此响应时,我想使用一些分页功能。我提到了this ,该问题讨论了特定 API 的分
我有一个与 Guice 的机器人腿示例非常相似的用例,只是我不知道我有多少条“腿”。因此我不能使用机器人腿示例所需的注释。 我希望使用 Guice 的 Multibindings 扩展将所有这些“腿”
(按标题道歉,我不能做得更好) 我的问题是找到一些通用的结构或“标准”函数来执行下一件事: xmap :: (a -> b) -> f a -> g b 然后,我们不仅可以映射元素,还可以映射整个结构
haskell 中是否有一个函数可以概括 Maybe 和 Either 函数? 例如,我正在想象一个这样的函数: generalizedFunc :: SOMETHING m => b -> (a -
下面函数模板的目标是取任意unordered_map并产生一个新的unordered_map与 key_type和 mapped_type倒。下面的函数适用于 std::unorderd_map .我
我是一名优秀的程序员,十分优秀!