内容补充:浅述WinForm多线程编程与Control.Invoke的应用

本文介绍了解决WinForm应用中窗体卡顿问题的两种策略:多线程结合Invoke与BackgroundWorker组件的使用,并提供了一个封装BackgroundWorker的小窗体示例,通过登录场景演示如何有效避免窗体响应迟钝。

前几天我转载了一篇随笔《浅述WinForm多线程编程与Control.Invoke的应用》,有博友反映说问题没有说到点上,我在这里为此做一个解释:随笔是别人写的,我想尊重原创的意愿、所以我也没有那篇随笔做任何更改。 还有,那篇随笔更加侧重的是知识点,而不是实例。

步入正题.

为了解决窗体卡死的问题,我常用的是如下的两种策略:

1、就是前文提到的 多线程 + Invoke

2、BackgroundWorker 组件

策略1优点就是 较灵活、适用更广泛,几乎可以用于解决任意情况下窗体卡死;而其缺点:需要自己额外编写许多代码、相对于策略2较为不方便。

相对而言、我还是较青睐于策略2,毕竟方便嘛,可以少写一些Code了。

分享我自己写的一个封装了BackgroundWorker的小窗体:

窗体描述:

一个Lable 用于显示提示语。

一个Button用于取消后台操作。

一个ProgressBar 用于动态滚动,还有个Timer配合提示语使用。
当然以上 都是 纯属交互式设计的一些东东、没什么实际意义。

封装代码如下:


  
public partial class FrmTipPrompt : Form
{
#region Field And Property

private Func < BackgroundWorker, DoWorkEventArgs, object > mDoWorkHandler;

private Action < RunWorkerCompletedEventArgs > mCompletedHandler;

private object mArgument;

private string mDialogTip;

private string mMsg;

private int mLen;

private RunWorkerCompletedEventArgs mCompletedResult;

/// <summary>
/// 只读
/// </summary>
public RunWorkerCompletedEventArgs CompletedResult
{
get { return mCompletedResult; }
}

public string Msg
{
get { return mMsg; }
}

#endregion


#region Construct

public FrmTipPrompt()
{
InitializeComponent();
}

#endregion


#region Public Method

public void SetParam(
Func
< BackgroundWorker, DoWorkEventArgs, object > doWorkHandler,
Action
< RunWorkerCompletedEventArgs > completedHandler,
object argument,
string strDialogTip)
{

this .mDoWorkHandler = doWorkHandler;
this .mCompletedHandler = completedHandler;
this .mArgument = argument;
if (strDialogTip == null )
{
this .mDialogTip = " 请稍后 " ;
}
else
{
this .mDialogTip = strDialogTip;
}
this .mLen = 1 ;
}

#endregion


#region Event Method

private void backWorker_DoWork( object sender, DoWorkEventArgs e)
{
if ( this .mDoWorkHandler != null )
{
e.Result
= this .mDoWorkHandler( this .backWorker, e);
}

}

private void backWorker_ProgressChanged( object sender, ProgressChangedEventArgs e)
{

}

private void backWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e)
{
this .mCompletedResult = e;
if ( this .mCompletedHandler != null )
{
this .mCompletedHandler(e);
}
this .DialogResult = System.Windows.Forms.DialogResult.OK;
}

private void FrmTipPrompt_Load( object sender, EventArgs e)
{
this .timerTip.Enabled = true ;
this .timerTip.Interval = 500 ;
this .backWorker.RunWorkerAsync( this .mArgument);
this .btnCancel.Focus();
}

private void timerTip_Tick( object sender, EventArgs e)
{
this .mLen ++ ;
this .mLen %= 6 ;

this .lblTip.Text = string .Format( " {0}{1} " , this .mDialogTip, new string ( char .Parse( " . " ), this .mLen));
}

private void btnCancel_Click( object sender, EventArgs e)
{
this .backWorker.CancelAsync();
}

private void FrmTipPrompt_FormClosing( object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
this .backWorker.CancelAsync();
}
}

#endregion

}

代码调用:以登录为例。


  
/// <summary>
/// 登录方法
/// 0:成功 -1:失败 1:取消登录 -2:联网登录用户名或密码错误 -3:网络异常 且 用户名或密码错误
/// </summary>
/// <param name="userLogin"> 用户名密码 </param>
/// <param name="strMsg">登录失败时的 错误信息 </param>
/// <returns> 返回登录结果 </returns>
public int Loading(UserLogin userLogin, ref string strMsg)
{
strMsg
= "" ;
using (FrmTipPrompt frm = new FrmTipPrompt())
{
frm.Width
= 375 ;
frm.SetParam(
this .LoadingPrompt, userLogin, " 登录中 " );
frm.ShowDialog();

RunWorkerCompletedEventArgs e
= frm.CompletedResult;
strMsg
= frm.Msg;

if (e.Cancelled || e.Result == null )
{
return 1 ;
}

int mLoginResult = 1 ;
if ( ! int .TryParse(e.Result.ToString(), out mLoginResult))
{
return 1 ;
}

return mLoginResult;
}
}

由于代码比较简单 我就不再额外加注释喽。

在车辆工程中,悬架系统的性能评估和优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性和稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮和车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向和纵向的动态影响,这使得工程师能够更加专注于分析优化垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描系统输入和输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统转化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性和共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值