1.异步处理:
private void button1_Click(object sender, EventArgs e)
{
var ResultTask = Task.Run(()=> {
Console.WriteLine("Helo I am TimeConsumingMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
Console.WriteLine("Helo I am TimeConsumingMethod after Sleep(5000). My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
return "Hello I am TimeConsumingMethod";
});
ResultTask.ContinueWith(OnDoSomthingIsComplete);
}
private void OnDoSomthingIsComplete(Task<string> t)
{
Action action = () => {
textBox1.Text = t.Result;
};
textBox1.Invoke(action);
Console.WriteLine("Continue Thread ID :" + Thread.CurrentThread.ManagedThreadId);
}
使用awite来实现
private async void button1_Click(object sender, EventArgs e)
{
var t = Task.Run(() => {
Thread.Sleep(5000);
return "Hello I am TimeConsumingMethod";
});
textBox1.Text = await t;
}
其中使用最简单的多线程服务方式为:
//新建一个Task
Task t1 = new Task(() => {
///写入操作方法;
});
//启动Task
t1.Start();
其中使用最简单的多线程服务方式为包括了中断:
解释:
主线程运行到t1.Wait()时,会读取t1的状态,当发现任务t1还未执行结束时,主线程便会阻塞在这个位置(只是阻塞在t1.Wait()位置,也就是说t1.Wait()之前的代码①照旧执行),当读取到t1的状态为已经执行结束时,主线程才会再次恢复执行,从t1.Wait()之后的位置②继续往下执行。
//新建一个Task
Task t1 = new Task(() => {
Console.WriteLine("Task完成!");
});
//启动Task
t1.Start();
Console.WriteLine("UI线程开始等待!"); //①
t1.Wait();
Console.WriteLine("UI线程完成!"); //②
更多task的参考请参考:
https://blog.csdn.net/num197/article/details/80320819
2.线程
#region 使用委托绑定dgv
delegate void dgvDelegate(List<Putaway> table);//使用委托
private void SetDgvDataSource(List<Putaway> table)//执行方法
{
if (dgv.InvokeRequired)
{
Invoke(new dgvDelegate(SetDgvDataSource), new object[] { table });
}
else
{
dgv.DataSource = table;
outlist = table;
}
}
Thread thread = new Thread(new ParameterizedThreadStart(BindDGV));
thread.IsBackground = true;
thread.Start("");
Task 的使用登录:
使用await 来等待获取数据
不要在 task 里控制 ui
enum errorcode { none, usernotexists, passwordError, … }
Task act { 登录验证 }
var code = await act();
根据 code 执行 ui 反馈
Task.Factory.StartNew(() =>
{
// 耗时操作,在Task中处理;
if (_CardRS.Init())
{
ShowInfo("初始化成功");
}
else
{
ShowInfo("初始化失败");
}
});