1. 开始一个Thread
开始一个Thread很简单,声明一个Thread实例,然后调用Start方法即可
Thread.Start
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Thread threadA = new Thread(new ThreadStart(WorkMethod));
threadA.Start();
Thread threadB = new Thread(new ParameterizedThreadStart(WorkMethodWithParam));
threadB.Start(obj);
2. Thread.Join阻塞调用线程,直到某个线程终止为止。
我按照msdn上的解释的理解是:
threadA.Join()方法是用来阻塞threadA线程,直到在threadA开始执行之后启动的线程执行完毕(或者Sleep了)之后,才开始执行threadA线程的方法
但是事实并非如我所想,下面是msdn上的例子,先声明了一个thread实例,然后将一个方法放入ThreadPool中执行,并调用thread的Join方法以阻塞thread的执行。显示结果在预料之中
MSDN Thread.Join例子
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Threading;
class IsThreadPool
{
static void Main()
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
Thread regularThread =
new Thread(new ThreadStart(ThreadMethod));
regularThread.Start();
ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod),
autoEvent);
// Wait for foreground thread to end.
regularThread.Join();
// Wait for background thread to end.
autoEvent.WaitOne();
}
static void ThreadMethod()
{
Console.WriteLine("ThreadOne, executing ThreadMethod, " +
"is {0}from the thread pool.",
Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("ThreadTwo, executing WorkMethod, " +
"is {0}from the thread pool.",
Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
// Signal that this thread is finished.
((AutoResetEvent)stateInfo).Set();
}
}
执行结果是:ThreadTwo, executing WorkMethod, is from the thread pool.
ThreadOne, executing ThreadMethod, is not from the thread pool.
但是当我对这个例子稍作修改之后就出现了不可理解的问题,我在WorkMethod中加上Thread.Sleep让线程池中的线程休眠2秒,这样操作之后执行结果是:
执行结果
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->ThreadTwo, executing WorkMethod, is from the thread pool.
Sleep
ThreadOne, executing ThreadMethod, is not from the thread pool.
Sleep end
可以看出当线程池中的线程Sleep之后,被Join的thread即获得执行权,开始执行,这个似乎和msdn的解释有出入
另外我还做了一个测试,把另一个线程用Thread启动,而不是放在线程池中执行,看是否可以正常的阻塞线程,但是结果却是出人意料的,不能按预期阻塞,请看下面的实例代码:
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> class IsThreadPool
{
static void Main()
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
Thread threadA =
new Thread(new ThreadStart(ThreadMethod));
Thread threadB = new Thread(new ParameterizedThreadStart(WorkMethod));
threadA.Start();
// Wait for foreground thread to end.
threadA.Join();
threadB.Start(autoEvent);
// Wait for background thread to end.
autoEvent.WaitOne();
Console.Read();
}
static void ThreadMethod()
{
Console.WriteLine("ThreadOne, executing ThreadMethod, " +
"is {0}from the thread pool.",
Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("ThreadTwo, executing WorkMethod, " +
"is {0}from the thread pool.",
Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
// Signal that this thread is finished.
((AutoResetEvent)stateInfo).Set();
}
}
不知道什么原因,上面的代码中threadA并没有被阻塞,难道是只能阻塞放在ThreadPool中执行的线程?没有道理,我反复做了实验都没有成功,把这个结果贴出来,请大家释疑。
分享到:
相关推荐
.Net 3.5 下使用的 System.Threading.Tasks。...安装完成后,添加引用时只需要在安装目录 C:\Program Files (x86)\Microsoft Reactive Extensions\Redist\DesktopV2 下找到 System.Threading.dll,添加即可
我在做一个兼容WindowsXP项目时用到,用梯子到外面找来的。 由于 .NET 3.5下并没有官方实现的 Task 库,所以,是通过 VS 中 NuGet 取得的 非官方 实现的 Task 库,调用接口与官方.NET 4.0 后的应该是差不多的。
在.NET框架中,`System.Threading.Timer`类是一个用于在后台线程上执行周期性操作的强大工具。这个类属于多线程编程的一部分,特别是在处理异步任务和定时触发事件时非常有用。下面我们将深入探讨`System.Threading....
.Net 3.5支持Plinq的相关信息已被微软撤掉了, 而引用此dll可以使3.5的Linq支持AsParallel()方法, 3.5可以使用1.0.3058.34407版本。...using System.Threading.Tasks; using System.Threading; using System.Linq;
本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③...
在C#编程中,`System.Threading`命名空间是多线程编程的核心,它提供了大量类和接口用于创建、管理和同步线程。`Thread`类是这个命名空间中的关键类,它代表了一个执行线程,允许程序员直接控制线程的生命周期。在`...
2. **System.Collections.Generic.List**: 这是一个动态数组,可以存储特定类型的对象。提供了添加、删除、查找和排序等功能。 3. **System.IO.Stream**: 表示数据流,是所有输入/输出流的基础。例如,FileStream...
在C#编程中,`System.Threading.Thread.Sleep`是一个非常有用的函数,它允许当前线程暂停执行指定的时间量,以便让其他线程有机会运行。在本文中,我们将深入探讨如何利用`Thread.Sleep`来实现即时输出信息,特别是...
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-...
标题中的"System.Diagnostics.Process的简单包装器,将其公开为System.Threading.Tasks"暗示了一个关于.NET框架中的两个关键组件的讨论:`System.Diagnostics.Process`类和`System.Threading.Tasks`命名空间。...
2. **System.String**:表示不可变的字符序列,提供了丰富的字符串操作方法,如`Substring()`、`Trim()`和`IndexOf()`。 3. **System.Int32**、**System.Double**、**System.Decimal**:整型、双精度浮点型和十进制...
• System.Windows.Threading.DispatcherObject类:WPF 中的大多数对象是从 DispatcherObject 派生的,这提供了用于处理并发和线程的基本构造。WPF 基于调度程序实现的消息系统。 • System.Windows....
标题中的“WCF 双工 和 System.Threading.Timer”的示例主要涵盖了两个重要的IT知识点:Windows Communication Foundation(WCF)的双工通信模式以及System.Threading.Timer类的使用。 首先,让我们详细了解一下WCF...
2. **System.Collections.Generic.List**: 这是一个动态数组,提供了一种高效、灵活的方式来存储和操作对象集合。它的`Add`, `Remove`, `IndexOf`等方法非常实用。 3. **System.IO.Stream**: 代表数据流,用于读写...