您的位置:首页 > 编程语言 > C#

C#多线程的一些小例子

2010-04-05 00:13 369 查看
/// <summary>
/// 反映拷贝进度的一个委托
/// </summary>
/// <param name="count"></param>
/// <param name="index"></param>
delegate void DelegateCopyProgressHandler(int count,int index);

/// <summary>
/// 本示例演示主线程与子线程优先级(默认情况下主线程具有较高优先级)
/// 默认情况,在新开启一个子线程的时候,他是前台线程.
/// 只有,将线程的IsBackground属性设为true;他才是后台线程
/// </summary>
static void Demo1()
{
Thread thread1 = new Thread(new ThreadStart(worker1));
thread1.Name = "A";
thread1.Start();

for (int i = 0; i < 100; i++)
{
Console.WriteLine("主线程执行{0}次",i+1);
}
Console.WriteLine("--------------------主线程执行结束----------------");
}

static void worker1()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("{0}线程执行第{1}次",Thread.CurrentThread.Name,i+1);
}

Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name);
}

/// <summary>
/// 子线程优先级别高于普通级别Normal(通过测试发现子线程总是获得较多的执行机会)
/// </summary>
static void Demo2()
{
new Thread(new ParameterizedThreadStart(delegate(object obj)
{
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
Thread.CurrentThread.Name = obj.ToString();

for (int i = 0; i < 100; i++)
{
Console.WriteLine("{0}线程执行第{1}次", Thread.CurrentThread.Name, i + 1);
}

Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name);
})).Start("A");

for (int i = 0; i < 100; i++)
{
Console.WriteLine("主线程执行{0}次", i + 1);
}
Console.WriteLine("--------------------主线程执行结束----------------");
}

/// <summary>
/// 测试当子线程是前台线程,则主线程结束是否影响其他线程的执行(运行结果主线程执行完成后如果发现仍有前台子线程在运行之中,那么子线程继续正常运行)
/// </summary>
static void Demo3()
{
Thread.CurrentThread.Name = "主线程";
new Thread(new ParameterizedThreadStart(item => {
Thread parentThread = item as Thread;
Thread.CurrentThread.Name = "A";
for (int i = 0; i < 100; i++)
{
Thread.Sleep(500);
Console.WriteLine("{0}线程执行第{1}次,{2}状态:{3}", Thread.CurrentThread.Name, i + 1, parentThread.Name,parentThread.ThreadState);
}
Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name);

})).Start(Thread.CurrentThread);

for (int i = 0; i < 10; i++)
{
Console.WriteLine("主线程执行{0}次", i + 1);
}
Console.WriteLine("--------------------主线程执行结束----------------");
Console.WriteLine("主线程结束时状态1:" + Thread.CurrentThread.ThreadState.ToString());

}

/// <summary>
/// 当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束
/// </summary>
static void Demo4()
{
Thread.CurrentThread.Name = "主线程";
new Thread(item =>
{
Thread parentThread = item as Thread;
Thread.CurrentThread.Name = "A";
Thread.CurrentThread.IsBackground = true;
for (int i = 0; i < 100; i++)
{
Thread.Sleep(500);
Console.WriteLine("{0}线程执行第{1}次,{2}状态:{3}", Thread.CurrentThread.Name, i + 1, parentThread.Name, parentThread.ThreadState);
}
Console.WriteLine("--------------------{0}线程结束--------------------", Thread.CurrentThread.Name);

}).Start(Thread.CurrentThread);

for (int i = 0; i < 10; i++)
{
Console.WriteLine("主线程执行{0}次", i + 1);
}
Console.WriteLine("--------------------主线程执行结束----------------");
Console.WriteLine("主线程结束时状态1:" + Thread.CurrentThread.ThreadState.ToString());
}

/// <summary>
/// 线程跨应用程序域执行
/// </summary>
static void Demo6()
{
Thread.CurrentThread.Name = "主线程";

AppDomain domainA = AppDomain.CreateDomain("JiangApp");
CrossAppDomainDelegate crossHandler = new CrossAppDomainDelegate(delegate() {
AppDomain currentDomain = AppDomain.CurrentDomain;
for (int i = 0; i < 10; i++)
{
Console.WriteLine("在/"{0}/"域中执行/"{1}/"线程第{2}次", currentDomain.FriendlyName, Thread.CurrentThread.Name,i+1);
Thread.Sleep(500);
if (i == 4)
{
throw new Exception(currentDomain.FriendlyName + "域内发生异常");
}
}
});
domainA.DoCallBack(crossHandler);

for (int i = 0; i < 10; i++)
{
Console.WriteLine("在/"{0}/"域中执行/"{1}/"线程第{2}次", AppDomain.CurrentDomain.FriendlyName, Thread.CurrentThread.Name, i + 1);

Thread.Sleep(500);

}
}

/// <summary>
/// 线程池示范
/// </summary>
static void Demo7()
{
int workerThreadCount = 0;
int compleThreadCount = 0;
ThreadPool.GetMaxThreads(out workerThreadCount,out compleThreadCount);
Console.WriteLine("最大辅助线程数量:{0},最大异步I/O线程数目:{1}",workerThreadCount,compleThreadCount);

ThreadPool.QueueUserWorkItem(item =>
{
Thread.CurrentThread.Name = "A";
Console.WriteLine("当前线程"+(Thread.CurrentThread.IsBackground?"是后台线程":"前台线程"));
for (int i = 0; i < 10; i++)
{
Console.WriteLine("{0}线程执行第{1}次",Thread.CurrentThread.Name,i+1);
}
});

ThreadPool.QueueUserWorkItem(item =>
{
Thread.CurrentThread.Name = "B";
Console.WriteLine("当前线程" + (Thread.CurrentThread.IsBackground ? "是后台线程" : "前台线程"));
for (int i = 0; i < 10; i++)
{
Console.WriteLine("{0}线程执行第{1}次",Thread.CurrentThread.Name,i+1);
}
});

Thread.Sleep(500);
}

/// <summary>
/// 异步编程示范
/// </summary>
static void Demo8()
{
DelegateCopyProgressHandler copyProgressHandler = new DelegateCopyProgressHandler((count, index) =>
{

Console.WriteLine("当前拷贝进度{0}/{1}",index,count);
Thread.Sleep(1000);

});

List<IAsyncResult> list = new List<IAsyncResult>();
//循环拷贝
for (int i = 0; i < 20; i++)
{
list.Add(copyProgressHandler.BeginInvoke(10, i + 1, null, null));

}

//Array.ForEach<IAsyncResult>(list,);
bool isOver = true;
while (true)
{
isOver = true;
Array.ForEach<IAsyncResult>(list.ToArray<IAsyncResult>(), item =>
{
if (!item.IsCompleted)
{
isOver = false;
}
});

if (isOver)
{
break;
}
Console.WriteLine("异步调用尚未结束,主线程等待...");
Thread.Sleep(500);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: