110,499
社区成员
发帖
与我相关
我的任务
分享
public void SetProcessInfo(int value)
{
if (progressBar1.InvokeRequired)
{
Action<int> setProcessDelegate = new Action<int>(SetProcessInfo);
progressBar1.Invoke(setProcessDelegate, value);
}
else
{//此处有断点1,条件(!progressBar1.InvokeRequired)
if (value > progressBar1.Maximum)
value = progressBar1.Maximum;
if (value < progressBar1.Minimum)
value = progressBar1.Minimum;
progressBar1.Value = value;//此处有断点2,条件(progressBar1.InvokeRequired)
}
}
ProcessForm frmProcess = (ProcessForm)ApplicationTool.FormsManager.GetForm(FormTypes.ProcessForm);
frmProcess.InitializeControl();//不确定子线程是否会在显示时,完成进度窗体的初始化,便手动初始化
var tokenSource = new CancellationTokenSource();
Task.Factory.StartNew(new Action<object>(ProgramStart), frmProcess, tokenSource.Token).ContinueWith(frmProcess.TaskOver);
DialogResult result = (frmProcess).ShowDialog();
这是form的构造函数,为了启动速度,我在main里面调用构造函数(false)
然后在子线程再调用的InitializeControl();但是InitializeControl里也是有InvokeRequired判断
#region 初始化
private bool _isInitializeControl;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="isInitialize">是否设置窗体子控件及属性(false)</param>
public ProcessForm(bool isInitialize = true)
{
if (isInitialize)
InitializeControl();
}
/// <summary>
/// 设置窗体子控件及属性
/// </summary>
public void InitializeControl()
{
if (!_isInitializeControl)
{
_isInitializeControl = true;
if (this.InvokeRequired)
{
this.Invoke(new Action(InitializeControl));
}
else
{
this.Controls.Clear();
InitializeComponent();
}
}
}
#endregion
public void SetProcessInfo(int value)
{
//System.Diagnostics.Debug.WriteLine("if:" + progressBar1.InvokeRequired);
if (progressBar1.InvokeRequired)
{
System.Diagnostics.Debug.WriteLine("if true:" + progressBar1.InvokeRequired);
Action<int> setProcessDelegate = new Action<int>(SetProcessInfo);
progressBar1.Invoke(setProcessDelegate, value);
}
else
{
//System.Diagnostics.Debug.WriteLine("else start:" + progressBar1.InvokeRequired);
if (value > progressBar1.Maximum)
value = progressBar1.Maximum;
if (value < progressBar1.Minimum)
value = progressBar1.Minimum;
//System.Diagnostics.Debug.WriteLine("else end:" + progressBar1.InvokeRequired);
if (progressBar1.InvokeRequired)//断点1,条件(!progressBar1.InvokeRequired)
{
System.Diagnostics.Debug.WriteLine("else end: true");
}
progressBar1.Value = value;//断点2,条件(progressBar1.InvokeRequired)
}
}
断点1未被击中直接击中的断点2,但是和上次没加断点1的区别是这次输出了 "else end: true"
神奇吧
public void SetProcessInfo(int value)
{
//System.Diagnostics.Debug.WriteLine("if:" + progressBar1.InvokeRequired);
if (progressBar1.InvokeRequired)
{
System.Diagnostics.Debug.WriteLine("if true:" + progressBar1.InvokeRequired);
Action<int> setProcessDelegate = new Action<int>(SetProcessInfo);
progressBar1.Invoke(setProcessDelegate, value);
}
else
{
//System.Diagnostics.Debug.WriteLine("else start:" + progressBar1.InvokeRequired);
if (value > progressBar1.Maximum)
value = progressBar1.Maximum;
if (value < progressBar1.Minimum)
value = progressBar1.Minimum;
//System.Diagnostics.Debug.WriteLine("else end:" + progressBar1.InvokeRequired);
if (progressBar1.InvokeRequired)
{
System.Diagnostics.Debug.WriteLine("else end: true");
}
progressBar1.Value = value;//断点2,条件(progressBar1.InvokeRequired)
}
}
public void SetProcessInfo(int value)
{
//System.Diagnostics.Debug.WriteLine("if:" + progressBar1.InvokeRequired);
if (progressBar1.InvokeRequired)
{
System.Diagnostics.Debug.WriteLine("if true:" + progressBar1.InvokeRequired);
Action<int> setProcessDelegate = new Action<int>(SetProcessInfo);
progressBar1.Invoke(setProcessDelegate, value);
}
else
{
//System.Diagnostics.Debug.WriteLine("else start:" + progressBar1.InvokeRequired);
if (value > progressBar1.Maximum)
value = progressBar1.Maximum;
if (value < progressBar1.Minimum)
value = progressBar1.Minimum;
//System.Diagnostics.Debug.WriteLine("else end:" + progressBar1.InvokeRequired);
progressBar1.Value = value;
}
}
这时候我输出显示:
程序启动
就直接击中了断点2;说明根本就没执行过if里面的内容