在 C# 中使用 WaitHandles 线程等待

Thread wait using WaitHandles in C#

这是我想要实现的目标。

我有一个登录 class。用户通过身份验证后,一些 post 登录操作将在线程中完成。然后用户进入主页。

现在我从主页转到另一个功能,比如 class FindProduct。我需要检查登录线程中的 post 登录操作是否完成。仅当 post 登录操作完成时,我才允许进入该功能。

我是否必须在 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
         }
    }
}

这里是如何使用 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
        }
    }
}

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