讲述多线程的文章,C#多线程操作方法:http://developer.51cto.com/art/200908/147771.htm
线程点滴:http://blog.youkuaiyun.com/gisfarmer/archive/2009/03/09/3973472.aspx
http://www.cnblogs.com/yizhu2000/archive/2008/01/03/1011958.html
线程池:
ThreadPool.QueueUserWorkItem(w, 1.0);
ThreadPool.QueueUserWorkItem(w, 2.0);
ThreadPool.QueueUserWorkItem(w, 3.0);
ThreadPool.QueueUserWorkItem(w, 4.0);
public static void Calculate(double Diameter)
{
return Diameter * Math.PI;
}
异步代理
public partial class Form1 : Form
{
//声明代理类型
delegate void delegateTest(int p);
//为代理类型创建新的实例
private delegateTest test=null;
//为了不影响界面响应,需要新建一个线程
Thread th = null;
public Form1()
{
InitializeComponent();
//为线程初始化
th = new Thread(new ThreadStart(run));
//初始化代理实例
test = new delegateTest(testD);
}
private void button1_Click(object sender, EventArgs e)
{
//方法通过调用线程开始
th.Start();
}
/// <summary>
/// 实际进行循环操作的函数
/// </summary>
void run()
{
for (int i = 0; i <= 100; i++)
{
///每次需要长时间处理的过程
Thread.Sleep(100);
//调用代理的方法
this.Invoke(test, i);
}
}
/// <summary>
/// 处理界面元素显示进度
/// </summary>
/// <param name="p"></param>
void testD(int p)
{
//处理界面元素显示进度
progressBar1.Value = p;
label1.Text = p+"%";
}
private void stop_Click(object sender, EventArgs e)
{
th.Abort();
this.Invoke(test, 0);
}
}
二:
class Program
{
private delegate void TestHandler(out int i);
private static void Test(out int i)
{
Thread.Sleep(1000);
i = 10;
}
private static void CallBack(IAsyncResult ar)
{
int i;
(ar.AsyncState as TestHandler).EndInvoke(out i, ar);
Console.WriteLine(i);
}
public static void Main()
{
int i;
TestHandler t = new TestHandler(Test);
// 1. CallBack
//IAsyncResult ar = t.BeginInvoke(out i, new AsyncCallback(CallBack), t);
// 2. EndInvoke
//IAsyncResult ar = t.BeginInvoke(out i, null, null);
//t.EndInvoke(out i, ar);
//Console.WriteLine(i);
// 3. WaitOne
//IAsyncResult ar = t.BeginInvoke(out i, null, null);
//ar.AsyncWaitHandle.WaitOne();
//t.EndInvoke(out i, ar);
//Console.WriteLine(i);
// 4. for wait
IAsyncResult ar = t.BeginInvoke(out i, null, null);
while (!ar.IsCompleted) { Thread.Sleep(10); }
t.EndInvoke(out i, ar);
Console.WriteLine(i);
Console.WriteLine("Press Enter key to exit...");
Console.ReadLine();
}
}
来自 http://www.cnblogs.com/yizhu2000/archive/2008/01/03/1011958.html#b4
一)使用Thread类
ThreadStart threadStart
=
new
ThreadStart(Calculate);
//
通过ThreadStart委托告诉子线程讲执行什么方法,这里执行一个计算圆周长的方法
Thread thread
=
new
Thread(threadStart);
thread.Start();
//
启动新线程

public
void
Calculate()
{
double Diameter=0.5;
Console.Write("The perimeter Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI);
}
二)使用Delegate.BeginInvoke
static CalculateMethod calcMethod = new CalculateMethod(Calculate); // 把委托和具体的方法关联起来
static void Main( string [] args)
{
// 此处开始异步执行,并且可以给出一个回调函数(如果不需要执行什么后续操作也可以不使用回调)
calcMethod.BeginInvoke( 5 , new AsyncCallback(TaskFinished), null );
Console.ReadLine();
}
// 线程调用的函数,给出直径作为参数,计算周长
public static double Calculate( double Diameter)
{
return Diameter * Math.PI;
}
// 线程完成之后回调的函数
public static void TaskFinished(IAsyncResult result)
{
double re = 0 ;
re = calcMethod.EndInvoke(result);
Console.WriteLine(re);
}
三)使用ThreadPool.QueueworkItem
WaitCallback w
=
new
WaitCallback(Calculate);
//
下面启动四个线程,计算四个直径下的圆周长
ThreadPool.QueueUserWorkItem(w,
1.0
);
ThreadPool.QueueUserWorkItem(w,
2.0
);
ThreadPool.QueueUserWorkItem(w,
3.0
);
ThreadPool.QueueUserWorkItem(w,
4.0
);
public
static
void
Calculate(
double
Diameter)
{
return Diameter * Math.PI;
}
3638

被折叠的 条评论
为什么被折叠?



