多线程和委托
来源:互联网 发布:物流开单软件 编辑:程序博客网 时间:2024/06/11 05:29
Task Fun带返回值的方法使用
List<Task<string >> task = new List<Task<string >>();
foreach (string[,] t in snMac)
{
task.Add ( Task<string>.Factory.StartNew(() => Test(t, folderAll)));
}
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<string>(s => { lblist[i].Text = s; }), str);
lblist[i].Invoke(new Action(() => { lblist[i].Text = str; }));
}
else
{
lblist[i].Text = str;
}
多线程同步锁:(独占对象)
lock();//只能锁定引用不能锁定值类型,比如可以锁list,数组,静态变量.objet、this.,锁住同一个对象(引用地址)就会互斥.
锁定时要考虑到底要锁什么对象,是为了锁定内容在使用时不被其它多线程修改.
为什么锁不了值型?
如果你传一个值类型,会装箱,下次代码运行到这里,又会装箱,两次不是同一个对象,所以锁不住.
异步委托
IAsyncResult cc = length.BeginInvoke("654646", "654654+45", null, null);//异步调用
int dd = length.EndInvoke(cc);//等待调用的结果,这里会阻塞主线程,一直在这里等着
带回调的异步委托
Func<string, string, int> length = ((aa, bb) =>
{
Thread.Sleep(2000);
return aa.Length + bb.Length;
});
length.BeginInvoke("654646", "654654+45", Deletgate_Next, length);
{
var del = (Func<string, string, int>) o.AsyncState;//将o接口对象转为对应的实例对象
int value = del.EndInvoke(o); //等待结果
MessageBox.Show(value.ToString());
if (button1.InvokeRequired)
{ button1.Invoke(new Action(() => { button1.Enabled = true; })); }
}
private void button2_Click(object sender, EventArgs e)
{
string srt = "";
Action<string, string> length = ((aa, bb) =>
{
Thread.Sleep(2000);
srt = aa + bb;
});
length.BeginInvoke("546545", "65465w", MyAsyncCallback, length);
MessageBox.Show("主函数");
}
public void MyAsyncCallback(IAsyncResult result)
{
Action<string, string> del = (Action<string, string>)result.AsyncState;
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<int>(i =>
{
lblist[1].Invoke(new Action(() =>
{
// lblist[1].Text = i.ToString();
Console.Write(i.ToString()+"\r\n");
}));
// Thread.Sleep(1000);
}));
- C#委托和多线程
- C#委托和多线程
- 多线程和委托用法
- 多线程和委托
- 委托和多线程的理解
- c# 多线程和异步委托实现进度条
- 黑马程序员之委托和多线程
- C#委托和多线程文章收藏
- 委托多线程
- 多线程(异步委托)调用和控件响应问题
- 利用多线程和委托技术做的一个抽奖机
- 委托的BeginInvoke和EndInvoke方法(多线程)
- C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法
- C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法
- c# 委托与多线程
- 多线程委托回调
- 多线程委托回调
- 多线程委托的应用
- mybatis 知识1
- 28.线程池
- mybatis 2
- ISE14.7与Modelsim10.1联合仿真设置
- mybatis 3
- 多线程和委托
- mybatis 4
- 软件测试基础学习
- 关于二分法查找
- LeetCode-Easy部分中标签为String 434. Number of Segments in a String
- C++STL全排列的简单实现
- 完成SSH项目 -- 实现dao层
- Eclipse和PyDev搭建完美Python开发环境(Windows篇)
- HLS(HTTP Live Streaming)协议之m3u8文件生成方式