多线程是一个很好的东西,在很多情况下可以解决效率问题,可以最大程度上提高CPU的使用率。
优点:1:资源利用率更高 2:设计上在某些情况下更简单, 3:程序响应时间更快 4:在异步的情况下用户界面更友好,用户体验更高。
但是同样,线程也带来了很多问题:例如:1:线程并发 2:在某些情况下 ,无法按顺序执行,会产生一些无法预测的bug 等
1:如何在子线程给窗体控件赋值? 这个一般使用的窗体界面上,用子线程给主窗体赋值时用到。
这里需要用到委托
private void bt_ThreadDele(object sender, EventArgs e)
{
Thread t2 = new Thread(DoWork); // 子线程方法的参数必须是无参 或 object类型
t2.IsBackground = true;
t2.Name = "Therad2";
t2.Start("参数");
}
//注意一点:子线程被therad加载时,1:不带参数,2:带参数 但是参数必须是 object
public void DoWork(object data)
{
this.Invoke(new Action(() => { txtbox1.Text = "hello word!" + data.ToString(); }));
}
2:在程序接口中,经常用到等待子线程运行结束再回到主线程。
class Program
{
public delegate void Entrust(string str); // 自动以委托,跟下面的Action 是同等功能
static void Main(string[] args)
{
Action<string> callback = new Action<string>(CallBack);
Thread th = new Thread(Fun2);
th.IsBackground = true;
th.Start(callback);
Console.ReadKey();
}
//主线程的方法
private static void CallBack(string str)
{
Thread d = Thread.CurrentThread;
string name = d.Name;
Console.WriteLine("当前线程名称:"+name);
}
// 子线程方法 ,这里被子线程启用,调用结束后,再实例化委托 Action
private static void Fun2(object obj)
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine("子线程循环操作第 {0} 次", i);
Thread.Sleep(500);
}
Action<string> callback = obj as Action<string>;
callback("我是子线程,我执行完毕了,通知主线程");
}
}
}