ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 应该何时处理ManualResetEvent?

2019-05-20 09:02:33  阅读:402  来源: 互联网

标签:c net multithreading idisposable manualresetevent


我正在使用一个使用ManualResetEvent同步线程的应用程序. FxCop告诉我处理这些物品.我发现以下讨论告诉了我同样的事情:

Do I need to Dispose() or Close() an EventWaitHandle?

但我不知道何时处理ManualResetEvent的实例.

以下简化代码演示了此问题:

private void btn_Click(object sender, EventArgs e)
{
    var mre = new ManualResetEvent(false);
    new Thread(() => this.SetEvent(mre)).Start();
    for (int i = 0; i < 10; ++i)
    {
        new Thread(() => this.WaitFor(mre)).Start();
    }
}

private void SetEvent(ManualResetEvent manualResetEvent)
{
    Thread.Sleep(10000);
    manualResetEvent.Set();
}

private void WaitFor(ManualResetEvent manualResetEvent)
{
    manualResetEvent.WaitOne();
}

问题是存在多个ManualResetEvent实例,并且多个线程正在等待每个实例.

如果我记住列表中的实例,我不知道何时处理它.在WaitOne()之后处理它 – 调用将多次处理它,并且可能在其他线程仍在等待时处理它.

创建事件的线程没有任何对它的引用. setter-thread不应该处置它,因为还有其他线程在等待这个MRE.每个等待的线程都无法像前面提到的那样处理它.

所以问题是:什么时候应该处理这个ManualResetEvent?

解决方法:

当您不再需要时,应该处理ManualResetEvent.你真正的问题是,“我怎么知道我不再需要它?”

通常,线程完成后会通知某些内容,并在线程上调用Join.或者线程设置一些事件以指示它已完成.如果您有多个线程,则它们都可以发出CountdownEvent信号.还有其他几种方法可以管理线程通知.

关键在于,如果您要分配资源,则由您决定是否正确配置.在上面的代码中,您没有任何方法可以跟踪正在执行的线程或哪些线程与哪个ManualResetEvent相关联.如果你想确保正确处理MRE,那么你必须跟踪它,不仅要跟踪MRE,还要跟踪哪些线程正在使用它,哪些线程已经完成了他们的工作,并在完成所有工作时得到通知完成线程以便您可以处理事物.

在您的特定情况下,如果您真的必须以这种方式使用MRE,我可能会创建一个包含对线程和MRE的引用的数据结构,以及线程在完成时发出信号的CountdownEvent.就像是:

class WorkUnit
{
    public List<Thread> Threads;
    public ManualResetEvent MRE;
    public CountdownEvent CE;
}

现在,当一个线程完成时,它会这样做:

workUnit.CE.Signal();

程序的其他部分(可能是主线程)会定期检查工作单元列表.对于该列表中的每个项目,它执行以下操作:

if (workUnit.CE.WaitOne(0))
{
    foreach (Thread t in workUnit.Threads)
    {
        t.Join();
    }
    // dispose the MRE and the CE
    // and remove the work unit from the list
}

是的,这是很多工作.如果您可以构建程序以便不必执行此类操作,那可能是最好的.

标签:c,net,multithreading,idisposable,manualresetevent
来源: https://codeday.me/bug/20190520/1141684.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有