2014-11-21 51 views
0

我正在使用C#中的用户界面。当用户点击'开始'按钮时,一个巨大的'for循环'开始工作。这个过程需要几分钟时间。程序运行时显示信息消息

我希望在forloop之前显示一条消息,并且在forloop之后消息将自动消失。我的目标是向用户提供诸如“正在运行,请稍候”等信息。

有没有办法做到这一点?

这是循环。它扫描图像并制作一些过程。

for (var i = 0; i <3504 ; i++) 
    for (var j = 0; j < 2306; j++) 
     { 
     ........ 
     } 
+1

使用[BackgroundWorker的](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx)。 – LarsTech 2014-11-21 00:16:40

+0

希望循环是线程? – BradleyDotNET 2014-11-21 00:19:45

+0

带'IProgress'的'async Task'可能是'BackgroundWorker'的另一种选择。 – Unflux 2014-11-21 00:28:00

回答

2

你没有说你正在使用的GUI框架,所以我要去承担形式。尽管WPF会相似。

让我们假设您单击名为“button1”的按钮后开始工作。创建一个Form子类,它是您的消息(为了举例,称为“MessageWaitForm”)。然后你可以使用它像这样:

private void SomeWork() 
{ 
    for (var i = 0; i <3504 ; i++) 
     for (var j = 0; j < 2306; j++) 
      { 
      ........ 
      } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (MessageWaitForm form = new MessageWaitForm()) 
    { 
     form.Shown += async (sender1, e1) => 
     { 
      await Task.Run(() => SomeWork()); 
      form.Close(); 
     } 

     form.ShowDialog(); 
    } 
} 

这将导致在一个单独的异步任务要执行的处理,一旦开始消息对话框中已被证明。任务完成后,执行将返回到form.Close()语句,从而允许消息窗体自动关闭。

请注意,我必须做一些假设并填写代码示例,以便可以提供可用的答案。以上内容可能与您现在的具体实施不符,但希望您能理解所阐述的基本概念并使其符合您的需求。

0

也许你的代码看起来像这样?我没有机会编译这个,但它应该足以让你开始。

private void StartBtn_OnClick(object sender, EventArgs e) 
{ 
    _isRunning = true; 
    CodeIsRunning.Visibility = Visibility.Visible; 
    //Anything else needed (disable buttons, etc) 
    Task.Factory.StartNew(() => { 
     for (var i = 0; i < 3504; i++) 
      for (var j = 0; j < 2306; j++) 
      { 
       ... 
      } 
     _isRunning = false; 
    }); 
}