解决界面卡死的问题


1.使用多线程

private void textBox2_TextChanged(object sender, EventArgs e) { int count = dataGridView1.Rows.GetRowCount(DataGridViewElementStates.Visible); Thread objThread = new Thread(new ThreadStart(delegate { string Temp = textBox2.Text.Trim(); for (int i = 0; i < count - 1; i++) { if (!dataGridView1.Rows[i].Cells[0].Value.ToString().ToUpper().Contains(Temp)) { dataGridView1.Rows[i].Visible = false; } } })); objThread.Start(); }

添加以下代码,忽略控件多线程的安全机制:(可实现,但不建议直接创建线程操作控件,控件上的大多数方法只能从创建控件的线程调用)

Control.CheckForIllegalCrossThreadCalls = false;

也可以使用Invoke

if(textbox1.InvokeRequired)
{
    textbox1.Invoke(new MethodInvoker(delegate { name = textbox1.text; }));
}

或者使用Task:

// 首先模拟耗时操作
private int TaskTest(int num, CancellationToken token) { // num = 0;
    for (int i = 0; i < int.MaxValue - 10; i++) { token.ThrowIfCancellationRequested(); num++; } return num; } // 添加了CancellationToken,因而支持取消 // 定义耗时操作完成之后的操作
private void ShowResult(Task<Int32> t) { try { MessageBox.Show(t.Result.ToString()); } catch (AggregateException ex) { MessageBox.Show("操作中断!"); } } // 最后是进行异步操作
Task<Int32> task = new Task<Int32>(n=>TaskTest(10,cancelSource.Token),0); task.Start(); Task tsk = task.ContinueWith(t => ShowResult(t));

2.使用委托+QueueUserWorkItem

delegate void ChangeInvoke(int num); private void ChangeNum(int num) { MessageBox.Show(num.ToString()); } private void DoSomeThing(object state) { int i = 0; for (int i = 0; i < int.MaxValue - 1; i++) { i++; } ChangeInvoke change = new ChangeInvoke(ChangeNum); this.Invoke(change, new object[] { i }); }

以下是通过QueueUserWorkItem异步调用

ThreadPool.QueueUserWorkItem(DoSomeThing);

3.APM(异步模型)

// 耗时操作
private int DoSomeThing(int num) { for (int i = 0; i < int.MaxValue - 10; i++) { num++; } return num; } // 耗时操作结束后的操作
private void APMDone(IAsyncResult result) { var sumDelegate = (Func<int, int>)result.AsyncState; try { int sumResult = sumDelegate.EndInvoke(result); MessageBox.Show(sumResult.ToString()); } catch (Exception e) { MessageBox.Show(e.Message); } } // 最后是调用的方法
Func<int, int> SumDelegate = TaskTest2; SumDelegate.BeginInvoke(0, APMDone, SumDelegate);


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM