gpt4 book ai didi

c# - Winforms 异步更新 UI 模式 - 需要概括

转载 作者:太空狗 更新时间:2023-10-30 00:46:19 26 4
gpt4 key购买 nike

设置:带有进度条和标签的主 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com