C#多线程编程1

1、使用Thread.start方法启动多线程。

/**
 * 服务检测
 */
ServiceMonitor serviceMonitor = new ServiceMonitor();
Thread serviceMonitorThread = new Thread(new ThreadStart(serviceMonitor.doMonitor));
serviceMonitorThread.Start();
/**
 * 爬虫监测
 */
CrawlerMonitor crawlerMonitor = new CrawlerMonitor();
Thread crawlerMonitorThread = new Thread(new ThreadStart(crawlerMonitor.doMonitor));
crawlerMonitorThread.Start();

/**
 * 内部空气质量监测
 */
IndoorAQIMonitor indoorAQIMonitor = new IndoorAQIMonitor();
Thread indoorAQIMonitorThread = new Thread(new ThreadStart(indoorAQIMonitor.doMonitor));
indoorAQIMonitorThread.Start();


Console.ReadKey();

只有各子线程均完成后,主线程才能推出。另外,它无法保证一个线程完成任务,等待另外一个线程。


2、使用Parallel简化Task

(参考:http://www.cnblogs.com/luminji/archive/2011/05/19/2050692.html

在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作。Parallel主要提供了3个有用的方法:For、ForEach、Invoke。

For方法,主要用于处理针对数组元素的并行操作,如下:

static void Main(string[] args)
{
    int[] nums = new int[] { 1, 2, 3, 4 };
    Parallel.For(0, nums.Length, (i) =>
    {
        Console.WriteLine("针对数组索引{0}对应的那个元素{1}的一些工作代码……",i, nums[i]);
     });
     Console.ReadKey();
 }

运行结果为:

针对数组索引0对应的那个元素1的一些工作代码……
针对数组索引2对应的那个元素3的一些工作代码……
针对数组索引1对应的那个元素2的一些工作代码……
针对数组索引3对应的那个元素4的一些工作代码……

可以看到,工作代码并不按照数组的索引次序进行遍历。显而易见,这是因为我们的遍历是并行的,不是顺序的。所以这里也可以引出一个小建议:如果我们的输出必须是同步的或者说必须是顺序输出的,则不应使用Parallel的方式。另外,只有Parallel内的所有线程都执行完毕,才会跳出代码,执行主线程。这样,就可以实现一个线程等待另外一个线程完成任务。

Foreach方法,主要用于处理泛型集合元素的并行操作,如下:

static void Main(string[] args)
{
    List<int> nums = new List<int> { 1, 2, 3, 4 };
    Parallel.ForEach(nums, (item) =>
    {
        Console.WriteLine("针对集合元素{0}的一些工作代码……", item);
    });
    Console.ReadKey();
}

输出为:

针对集合元素1的一些工作代码……
针对集合元素4的一些工作代码……
针对集合元素3的一些工作代码……
针对集合元素2的一些工作代码……

使用For和Foreach方法,Parallel类型自动为我们分配Task完成针对元素的一些工作。当然我们也可以直接使用Task,但是上面的这种形式,在语法上看上去更简洁了。

Parallel的Invoke方法,则为我们简化了启动一组并行操作,它隐式启动的就是Task。该方法接受Params Action[]参数,如下:

static void Main(string[] args)
{
    Parallel.Invoke(() =>
    {
         Console.WriteLine("任务1……");
    },
    () =>
    {
         Console.WriteLine("任务2……");
    },
         () =>
    {
         Console.WriteLine("任务3……");
    });
    Console.ReadKey();
}

输出为:

任务2……
任务3……
任务1……

同样,由于所有的任务都是并发的,所以它不保证先后次序。

另外,通过比较可以看出,For主要针对一般集合的并行操作,Foreach主要针对泛型集合的类型操作,Invoke主要针对函数代码(或匿名函数)的类型操作。

转载请注明:康瑞部落 » C#多线程编程1

0 条评论

    发表评论

    电子邮件地址不会被公开。 必填项已用 * 标注