在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
/// <summary>
/// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
///作者:周公
/// 时间:2008-5-17
/// 原发地址:http://blog.csdn.net/zhoufoxcn
/// </summary>
public class ThreadDemo
{
private Thread threadOne;
private Thread threadTwo;
private ArrayList stringList;
private event EventHandler OnNumberClear;//数据删除完成引发的事件
public static void Main()
{
ThreadDemo demo = new ThreadDemo(1000);
demo.Action();
}
public ThreadDemo(int number)
{
Random random = new Random(1000000);
stringList = new ArrayList(number);
for (int i = 0; i < number; i++)
{
stringList.Add(random.Next().ToString());
}
threadOne = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
threadTwo = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
threadOne.Name = "线程1";
threadTwo.Name = "线程2";
OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);
}
/// <summary>
/// 开始工作
/// </summary>
public void Action()
{
threadOne.Start();
threadTwo.Start();
}
/// <summary>
/// 共同做的工作
/// </summary>
private void Run()
{
string stringValue = null;
while (true)
{
Monitor.Enter(this);//锁定,保持同步
stringValue = (string)stringList[0];
Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);
stringList.RemoveAt(0);//删除ArrayList中的元素
if (stringList.Count == 0)
{
OnNumberClear(this, new EventArgs());//引发完成事件
}
Monitor.Exit(this);//取消锁定
Thread.Sleep(5);
}
}
//执行完成之后,停止所有线程
void ThreadDemo_OnNumberClear(object sender, EventArgs e)
{
Console.WriteLine("执行完了,停止了所有线程的执行。");
threadTwo.Abort();
threadOne.Abort();
}
}
说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程(主要是回答csdn论坛的一个朋友的问题才用了这种办法)。
分享到:
相关推荐
C#线程同步是多线程编程中的一个重要概念,它涉及到如何控制多个线程对共享资源的访问,以避免数据不一致性和竞态条件。在C#中,线程同步通常用于确保在某一时刻只有一个线程可以访问特定的代码块或资源,从而保证...
以下是一个简单的互斥访问同一变量的C#代码示例: ```csharp public class SharedResource { private int sharedValue = 0; private object syncObject = new object(); public void Increment() { lock ...
本示例“C#多线程排序例子”聚焦于如何利用多线程来提升排序操作的速度。 首先,让我们了解什么是多线程。在计算机程序中,线程是程序执行的基本单元,每个线程都有自己的执行路径。在单线程环境中,代码按顺序执行...
这个例子虽然简单,但它提供了一个了解C#多线程基本操作的起点,包括线程创建、参数传递、同步机制以及与UI交互。在实际应用中,开发者还需要考虑更多的线程管理、异常处理以及性能优化等问题。
下面是一个简单的示例,展示了Mutex和AutoResetEvent的使用: ```csharp using System; using System.Threading; class MultiThreadingExample { private static Mutex mutex = new Mutex(); private static ...
总结,C#多线程执行是一个复杂而强大的主题,包括但不限于线程创建、同步机制、异步编程、线程池和任务管理。理解并熟练掌握这些概念和工具,对于编写高效、响应迅速的C#应用程序至关重要。而...
在提供的"ThreadTest"文件中,很可能是包含了一个或多个人关于C#多线程和Mutex使用的示例代码。这些示例可能涵盖了创建线程、使用Mutex进行同步以及处理线程间的通信等实际应用场景。通过学习这些例子,你可以更好地...
这种方法提供了一个简单的同步机制,确保线程安全,并防止用户在任务完成前进行不适当的交互。 实现这个功能的基本步骤如下: 1. 创建一个继承自`Form`的子类,比如`WaitForm`,用于显示等待状态。 2. 在需要启动...
在C#编程中,多线程是一个核心概念,特别是在处理并发任务、提高应用程序性能和响应速度时至关重要。本文将深入探讨C#中的多线程,包括如何创建不带参数和带参数的线程函数。 首先,让我们理解什么是线程。线程是...
《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...
多线程允许一个应用程序同时执行多个任务,每个任务都在一个独立的线程上运行。C#中,我们可以通过System.Threading命名空间下的类来创建和管理线程。主线程是应用程序启动时默认创建的,而额外的线程可以由开发者...
以下是一个简单的后台线程示例: ```csharp using System; using System.Threading; class Program { static void Main() { // 创建一个后台线程 Thread backgroundThread = new Thread(new ThreadStart...
C#关于多线程开发技术的例子,这个代码是结合多线程案例自己写的一个程序,模拟图书馆借阅书籍,在同时发生书籍搜索的时候进行的一些线程同步和加锁机制。
本教程通过四个具体的实例深入探讨C#中的多线程编程,涵盖建立线程、同步机制、加锁以及线程间的协作。 首先,我们来看"1 多线程",这可能是一个介绍如何创建和启动线程的基础示例。在C#中,我们可以使用`System....
本项目"winform_c#_多线程例子"显然是一个演示如何在Winform应用中正确使用多线程的示例。 多线程允许应用程序同时执行多个不同的任务,提高程序的并发性和效率。在Winform中,主线程主要负责用户界面的交互,而...
60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建...另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己
学习C#多线程不仅需要理解理论知识,更重要的是实践。通过编写并运行实际的多线程程序,你可以更好地理解线程的创建、执行、同步以及可能出现的问题。本教程中的例子将为你提供宝贵的实践经验,帮助你成为一个熟练的...
"大漠的c#多线程模板"提供了一个实际的例子,帮助开发者理解和应用多线程技术。下面我们将深入探讨这个主题。 首先,我们要了解C#中的`System.Threading`命名空间,它是实现多线程的基础。其中,`Thread`类是创建和...
在这个"C#线程、线程池和线程间同步的例子"中,我们可以深入学习到如何在VS2008环境下创建和管理线程。 首先,线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在C#中,我们可以通过`System....