在我的C#程序中有一个“登录”函数。当用户按下按钮-程序使用给定的登录/pas信息登录到某个网站上,使用POST url并保存cookie。登录后的网页将在我的程序中进一步处理。然后,将结果显示给用户。
的问题是-当用户点击一个按钮-整个程序挂断,并等待从上面的操作完成。这是大约3-5秒的不活动。。
我希望在此期间阻止用户输入并提示消息,例如“working.”。其他人没有办法知道这个程序实际上是在做什么或者没有做什么。我的意思是:

我应该用什么技术来达到预期的目标?
发布于 2013-05-29 11:27:06
UI被阻塞,因为您正在UI线程中运行登录代码。为了避免这种情况,你可以使用‘背景工作’,或者如果你使用的是4或4.5 .NET,你可以使用‘任务’将你的登录内容移动到另一个线程,以避免用户界面阻塞。
如果Windows和.NET 4+,下面的操作可能有效:
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
Task.Factory.StartNew(Login)
.ContinueWith(t =>
{
progressBar1.Visible = false;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
private static void Login()
{
// should replace this with actual login stuff
Thread.Sleep(TimeSpan.FromSeconds(3));
}它所做的是将登录处理移动到另一个线程,因此UI线程不会被阻塞。在开始登录之前,它会打开进度条,它的样式设置为marque,登录完成后,它会再次隐藏进度条。
只要UI不被阻塞,用户就可以在登录期间输入/按下他想要的任何内容,因此解决方案要么是在登录前禁用所有控件,要么以单独的模式形式显示进度条,这样用户就不会看到应用程序挂起,并且在关闭进度条表单之前无法进行任何输入。
更新:添加了带有单独进度表单的示例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MarqueeForm.DoWithProgress("Doing login", Login);
}
private static void Login()
{
Thread.Sleep(TimeSpan.FromSeconds(3));
}
}
public class MarqueeForm : Form
{
private Label label;
public MarqueeForm()
{
var progressBar = new ProgressBar
{
Style = ProgressBarStyle.Marquee,
Top = 20,
Size = new Size(300, 15)
};
Controls.Add(progressBar);
label = new Label();
Controls.Add(label);
}
public static void DoWithProgress(string title, Action action)
{
var form = new MarqueeForm
{
Size = new Size(310, 50),
StartPosition = FormStartPosition.CenterParent,
FormBorderStyle = FormBorderStyle.FixedDialog,
ControlBox = false,
label = { Text = title }
};
form.Load += (sender, args) =>
Task.Factory.StartNew(action)
.ContinueWith(t => ((Form)sender).Close(),
TaskScheduler.FromCurrentSynchronizationContext());
form.Show();
}
}发布于 2013-05-29 11:19:05
按下按钮时,您可以禁用按钮button1.Enable = false;,同时显示“请等待.”之类的消息。当进程完成并显示结果时启用按钮。
发布于 2013-05-29 11:23:48
我想问题是关于表格申请的?
如果是这样的话,您可以将表单设置到“加载屏幕”,然后执行一个Application.Doevents();然后启动流程。完成后,您可以删除您的“加载屏幕”。
https://stackoverflow.com/questions/16812370
复制相似问题