首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理正在进行中的任务

如何处理正在进行中的任务
EN

Stack Overflow用户
提问于 2013-05-29 11:13:12
回答 3查看 247关注 0票数 4

在我的C#程序中有一个“登录”函数。当用户按下按钮-程序使用给定的登录/pas信息登录到某个网站上,使用POST url并保存cookie。登录后的网页将在我的程序中进一步处理。然后,将结果显示给用户。

的问题是-当用户点击一个按钮-整个程序挂断,并等待从上面的操作完成。这是大约3-5秒的不活动。

我希望在此期间阻止用户输入并提示消息,例如“working.”。其他人没有办法知道这个程序实际上是在做什么或者没有做什么。我的意思是:

我应该用什么技术来达到预期的目标?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-29 11:27:06

UI被阻塞,因为您正在UI线程中运行登录代码。为了避免这种情况,你可以使用‘背景工作’,或者如果你使用的是4或4.5 .NET,你可以使用‘任务’将你的登录内容移动到另一个线程,以避免用户界面阻塞。

如果Windows和.NET 4+,下面的操作可能有效:

代码语言:javascript
复制
  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不被阻塞,用户就可以在登录期间输入/按下他想要的任何内容,因此解决方案要么是在登录前禁用所有控件,要么以单独的模式形式显示进度条,这样用户就不会看到应用程序挂起,并且在关闭进度条表单之前无法进行任何输入。

更新:添加了带有单独进度表单的示例:

代码语言:javascript
复制
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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-05-29 11:19:05

按下按钮时,您可以禁用按钮button1.Enable = false;,同时显示“请等待.”之类的消息。当进程完成并显示结果时启用按钮。

票数 0
EN

Stack Overflow用户

发布于 2013-05-29 11:23:48

我想问题是关于表格申请的?

如果是这样的话,您可以将表单设置到“加载屏幕”,然后执行一个Application.Doevents();然后启动流程。完成后,您可以删除您的“加载屏幕”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16812370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档