//Task 取消线程
CancellationTokenSource cts = new CancellationTokenSource();
cts.Cancel();//传达取消请求
if (cts.IsCancellationRequested)
{
MessageBox.Show(@"取消成功.");
}
else
{
MessageBox.Show(@"没有取消,还在执行.");
}
Task.Factory.StartNew(new Action(() =>
{
MessageBox .Show (@"这里是一个委托.");
}),cts .Token );//cts .Token就是记录会在cath在把已取消的线程显示
//这种不会卡界面
while (task.Count(r => r.IsCompleted) < task.Count())//等待所有线程都完成后就退出循环
{
lb_out.Text = @"筛选中……";
lb_out.ForeColor = Color.Blue;
System.Threading .Thread . Sleep(500);
}
Task Fun带返回值的方法使用
List
foreach (string[,] t in snMac)
{
task.Add ( Task
}
Task.WaitAll(task.ToArray());
foreach (var itmes in task)
{
txt_out.AppendText(itmes.Result);//取值
}
th.join();方法
在哪个线程中执行就会阻塞哪个线程,直到th执行完成后才会继续执行.
ThreadPool.QueueUserWorkItem 线程池,本身是后台线程.放在不用人为去管它,而且很快就执行完的地方.不用start自动开始执行.
ThreadPool.QueueUserWorkItem((ob) =>
{
for (int i = 0; i < 50; i++)
{
lblist[0].Invoke(new Action(() =>
{
lblist[0].Text = i.ToString();
}));
Thread.Sleep(100);
}
});
多线程跨线程访问:
if (lblist[i].InvokeRequired)//判断是不是要调用Invoke方法(跨线程访问true为要调用,反之……)
{
//lblist[i].Invoke(new Action
lblist[i].Invoke(new Action(() => { lblist[i].Text = str; }));
}
else
{
lblist[i].Text = str;
}
多线程同步锁:(独占对象)
lock();//只能锁定引用不能锁定值类型,比如可以锁list,数组,静态变量.objet、this.,锁住同一个对象(引用地址)就会互斥.
锁定时要考虑到底要锁什么对象,是为了锁定内容在使用时不被其它多线程修改.
为什么锁不了值型?
如果你传一个值类型,会装箱,下次代码运行到这里,又会装箱,两次不是同一个对象,所以锁不住.
private void button2_Click(object sender, EventArgs e)
{
string srt = "";
Action
{
Thread.Sleep(2000);
srt = aa + bb;
});
length.BeginInvoke("546545", "65465w", MyAsyncCallback, length);
MessageBox.Show("主函数");
}
public void MyAsyncCallback(IAsyncResult result)
{
Action
del.EndInvoke(result);
MessageBox.Show("异步回调函数");
}
Parallel下面有三个常用的方法invoke,For和ForEach。
Thread th=new Thread (()=>{
Parallel.Invoke(new Action(() =>
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
}), new Action(() =>
{
for (int i = 100; i < 200; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
}));
MessageBox.Show(sw.Elapsed.Seconds.ToString());
sw.Stop();
});
//可以样多个方法在最快的时间里所有代码一起执行,可以看出方法是并行执行的,执行效率提高了很多。调度时发现会阻塞主线程,最好配合多线程一起执行.
Parallel.For(0, 50, new Action
{
lblist[1].Invoke(new Action(() =>
{
// lblist[1].Text = i.ToString();
Console.Write(i.ToString()+"\r\n");
}));
// Thread.Sleep(1000);
}));