异步加载还是出问题?
//先是定义
public delegate void DelegateLoadName1(string tblName ,ComboBox cmb);
....
//接着再加载过程定义
DelegateLoadName1 qudao = new DelegateLoadName1(AsyLoadName1);
AsyncCallback Aysqudao = new AsyncCallback(this.AsyncCallbackValue);
qudao.BeginInvoke("tbqudao", cmbCzFs, Aysqudao, "渠道加载");
.....
//定义了委托方式
#region 异步加载数据库快捷信息
private void AsyncCallbackValue(IAsyncResult ar)
{
Console.WriteLine("" + ar.AsyncState +"加载结束");
}
private void AsyLoadName1(string tblname, ComboBox cmb)
{
CBaseFunc.LoadName(tblname , cmb );
}
private void AsyLoadName2(string tblname, ComboBox cmb,int tmp)
{
CBaseFunc.LoadName(tblname , cmb , tmp);
}
#endregion
//
/// <summary>
/// 加载基本表的名称
/// </summary>
/// <param name="tblName"></param>
/// <param name="cmb"></param>
public static void LoadName(string tblName, ComboBox cmb)
{
TianLi.BLL.tbBaseInfo fBl= new TianLi.BLL.tbBaseInfo(tblName);
cmb.SuspendLayout();
cmb.Items.Clear(); ///**********提示线程冲突
cmb.BeginUpdate();
try
{
if (fBl.GetAllName() == null)
{ cmb.EndUpdate(); }
else
{
cmb.Items.AddRange(fBl.GetAllName().ToArray());
cmb.EndUpdate();
}
// cmb.SelectedIndex = 0;
cmb.ResumeLayout();
}
catch (Exception ex)
{ Console.WriteLine(ex.Message); }
}
[解决办法]
后台线程中是不能直接操作控件的,你这里提示线程才冲突的地方还是多线程部分,非主线程回调。
[解决办法]
Control.InvokeRequired判断下
[解决办法]
begininvoke会建一个相对于UI线程新的线程,所以combox的操作还是在多线程的部分,所以造成了线程冲突,要么关闭线程冲突检查,要么在做一个委托对combox进行操作