在 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 检查会话变量。
这是我想要实现的目标。
我有一个登录 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 检查会话变量。