优秀的编程知识分享平台

网站首页 > 技术文章 正文

183.C# 线程同步(c# 线程间通信的几种方法)

nanyue 2024-10-25 13:19:56 技术文章 2 ℃

摘要


当一个线程执行递增和递减操作时,其他线程需要依次等待。

正文


AutoResetEvent

AutoResetEvent是.net线程简易同步方法中的一种。AutoResetEvent 常常被用来在两个线程之间进行信号发送

两个线程共享相同的AutoResetEvent对象,线程1可以通过调用AutoResetEvent对象的WaitOne()方法进入等待状态,然后另外一个线程2通过调用AutoResetEvent对象的Set()方法取消等待的状态。

AutoResetEvent如何工作的

在内存中保持着一个bool值,如果bool值为False,则使线程阻塞,反之,如果bool值为True,则使线程退出阻塞。当我们创建AutoResetEvent对象的实例时,我们在函数构造中传递默认的bool值,以下是实例化AutoResetEvent的例子。

WaitOne 方法

该方法阻止当前线程继续执行,并使线程进入等待状态以获取其他线程发送的信号。WaitOne将当前线程置于一个休眠的线程状态。WaitOne方法收到信号后将返回True,否则将返回False。

Set 方法

AutoResetEvent Set方法发送信号到等待线程以继续其工作。

一个例子

int Data = 0;
AutoResetEvent autoReset = new AutoResetEvent(false);

private void btnTest_Click(object sender, EventArgs e)
{
    Thread t=new Thread(() => { ReturnData(); });
    t.Start();
    lblValue.Text = "等待中...";
    autoReset.WaitOne();//等待线程完成
    lblValue.Text = #34;取得Value{Data}";
}

private void ReturnData()
{
    Thread.Sleep(5000);
    Data=new Random().Next(1,999);
    autoReset.Set();//发送信号
}

这样好像Sleep把窗口要冻结5秒,我们修改一下。

int Data = 0;
AutoResetEvent autoReset = new AutoResetEvent(false);

private void btnTest_Click(object sender, EventArgs e)
{
    Thread thread = new Thread(Do);
    thread.Start();
}

private void Do()
{
    Thread t = new Thread(() => { ReturnData(); });
    t.Start();
    this.BeginInvoke(() =>
    {
        lblValue.Text = "等待中...";
    });
    autoReset.WaitOne();
    this.BeginInvoke(() =>
    {
        lblValue.Text = #34;取得Value{Data}";
    });
}

private void ReturnData()
{
    Thread.Sleep(5000);
    Data = new Random().Next(1, 999);
    autoReset.Set();
}

Tags:

最近发表
标签列表