- 相关推荐
关于Winform多线程方式登录代码
为了方便大家学习相关的知识,YJBYS小编下面为你整理了关于Winform多线程方式登录代码,希望对你有所帮助。
bool restart = true;
while (restart)
{
Start(out restart);
}
(1):在主进程中不停的调用start.
void Start(out bool restart)
{
bool connected = false;
restart = false;
string[] userInfo = null;
try
{
//打开LoginInfoForm窗体,返回用户名密码。
userInfo = GetLoginInfo();// Splasher.GetLoginInfo();
if (userInfo == null)
{
loginOK = false;
return;
}
//启动登陆后台线程。LoginProcessForm窗体启动MySplashThread启动不停的打开LoginProcessForm窗体。
Splasher.Show();
}
catch (Exception err)
{
DebugHelper.Write(err);
Splasher.ShowDialog("录入登录信息发生异常,请和管理员联系", MessageTipType.Error);
return;
}
eProcessState previousStepResult = eProcessState.Complete;
while (Splasher.StartExecute())
{
try
{
switch (Splasher.CurrentStep)
{
case eLoginState.__:
case eLoginState.__:
case eLoginState.__:
case eLoginState.__:
}
previousStepResult = eProcessState.Complete;
//结束执行
Splasher.EndExecute(previousStepResult);
}
catch (Exception error)
{
//略
}
}
}
//start中的对过程的控制。
static public void Show()
{
try
{
//当第二次调用的时候MySplashThread != null了这个时候
if (MySplashThread != null)
{
// public void Reset()
//{
// progressView.Reset();
//currentItemIndex = 0;
//}
//相当于触发MySplashForm.Reset事件。
MySplashForm.Invoke(new MethodInvoker(MySplashForm.Reset));
//将窗体显示出来。
MySplashForm.Invoke(new MethodInvoker(MySplashForm.Show));
return;
}
//当第一次的时候调用构造函数构造出窗体。构造出来以后myResetEvent.Set();通知
if (MySplashForm == null)
{
MySplashForm = new LoginProcessForm(myResetEvent);
}
//这里只是每次都调用Application.Run(MySplashForm);作用相当于建立起信息循环队列
MySplashThread = new Thread(new ThreadStart(Splasher.ShowThread));
MySplashThread.IsBackground = true;
MySplashThread.SetApartmentState(ApartmentState.STA);
MySplashThread.Start();
//等待直到myResetEvent.Set();
myResetEvent.WaitOne(5000);
}
catch (Exception err)
{
DebugHelper.Write(err);
}
}
//构造函数。
public LoginProcessForm(AutoResetEvent autoreset)
{
myResetEvent = autoreset;
Renderer = new SkinFormLoginFormRender();
InitializeComponent();
//this.TopMost = true;
//this.CloseBox = true;
CanMoveWindow = false;
labelVersion.Text = "Version:" + AssemblyInfoHelper.AssemblyFileVersion;
this.Load += new EventHandler(LoginProcessForm_Load);
}
delegate void EndExecuteCallback(eProcessState previousProcessResult);
static public void EndExecute(eProcessState previousProcessResult)
{
//winform中子线程不能更新主线程的控件。所以MySplashForm.InvokeRequired代表是否需要更新主线程控件。
//如果需要更新的话MySplashForm.Invoke
if (MySplashForm.InvokeRequired)
{
//回调会继续执行previousProcessResult,等下次的时候就会到下面去执行了。
MySplashForm.Invoke(new EndExecuteCallback(EndExecute), previousProcessResult);
}
else
{
//如果
MySplashForm.EndExecute(previousProcessResult);
}
}
///
/// 进入下一过程
///
///
///
public void EndExecute(eProcessState previousProcessResult)
{
//progressView为我们使用的用户控件
progressView.SetTip(processItems[currentItemIndex], previousProcessResult);
currentItemIndex++;
}
//关闭代码
static public void Close()
{
try
{
if (MySplashThread == null) return;
if (MySplashForm == null) return;
try
{
MySplashForm.Invoke(new MethodInvoker(MySplashForm.Close));
}
catch (Exception err)
{
DebugHelper.Write(err);
}
MySplashThread.Abort();
}
catch (Exception err)
{
DebugHelper.Write(err);
}
finally
{
MySplashThread = null;
MySplashForm = null;
}
}
【Winform多线程方式登录代码】相关文章:
Java多线程的实现方式11-03
显示jquery代码的四种方式10-31
PHP Curl多线程原理详解09-16
Excel2010的多线程计算10-11
过滤HTML代码08-30
HTML的代码注释09-24
关于MyEclipse代码提示设置包括html和jsp的代码07-29
java多线程面试题201707-27
科目三扣分代码11-02
PHP代码优化技巧09-24