这是我想要实现的目标。
我有一个登录类。一旦用户通过身份验证,一些帖子登录操作就在一个线程中完成。并且用户进入主页。
现在从主页我转到一个不同的功能,比如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
}
}
}
答案 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中检查会话变量。