在C#中使用WaitHandles进行线程等待

时间:2016-09-20 05:25:24

标签: c# multithreading waithandle

这是我想要实现的目标。

我有一个登录类。一旦用户通过身份验证,一些帖子登录操作就在一个线程中完成。并且用户进入主页。

现在从主页我转到一个不同的功能,比如FindProduct类。我需要检查登录线程中的登录后操作是否完成。仅在完成登录后操作后才允许输入功能。

我是否必须在PerformLoginAsyncThread以及OnClickFindProduct上放置等待句柄?

Class Login
{
   public bool Login(Userinfo)
   {
      // do tasks like authenticate
      if(authenticationValid)
         {
          PerformLoginAsyncThread(UserInfo)
          //continue to homepage
         }
   }   

}

Class HomePage
{
   public void OnClickFindProduct
   {
     if(finishedPostLoginThread)
        // proceed to Find Product page
     else
         {
           //If taking more than 8 seconds, throw message and exit app
         }
    }
}

2 个答案:

答案 0 :(得分:1)

以下是如何使用EventWaitHandle的一般概念。在完成工作之前,您需要Reset,并在完成工作后Set

在下面的示例中,我将ResetEvent属性设置为静态,但我建议您以某种方式传递实例,如果没有有关您的体系结构的更多详细信息,我就无法执行此操作。

class Login
{
     private Thread performThread;
     public static ManualResetEvent ResetEvent { get; set; }
     public bool Login(Userinfo)
     {
        // do tasks like authenticate
        if(authenticationValid)
        {
            PerformLoginAsyncThread(UserInfo);
            //continue to homepage
        }
    }   

    private void PerformLoginAsyncThread(UserInfo)
    {
        ResetEvent.Reset();
        performThread = new Thread(() => 
        {
            //do stuff
            ResetEvent.Set();
        });
        performThread.Start();
    }
}

class HomePage
{
    public void OnClickFindProduct
    {
        bool finishedPostLoginThread = Login.ResetEvent.WaitOne(8000);
        if(finishedPostLoginThread)
        {
            // proceed to Find Product page
        }
        else
        {
            //If taking more than 8 seconds, throw message and exit app
        }
    }
}

答案 1 :(得分:0)

如果您不想通过等待或引发事件来使您的逻辑复杂化,那么最简单的解决方案就是在PerformLoginAsyncThread函数内部,只需在完成时将会话变量设置为true,并在OnClickFindProduct中检查会话变量。