C#-VS2010:如何在不阻塞UI的情况下做一些事情并等待一段时间?
我正在制作一个简单的应用程序,我需要做一些事情,并更新一个进度条。我做一些事情,等待1秒,如果执行正常,我增加一个进度条,做一些其他事情,再等一秒钟,如果正常,增加进度条,以此类推,7次。这意味着我通过RS232连接到一个电子板,发送一些命令,然后执行,1秒钟后我检查板上的一切是否正常。我需要等一秒钟,等黑板上有类似的东西 问题在于等待那一秒钟。如果我使用Thread.Sleep(1000),整个UI会冻结(正如预期的那样),进度条也会因为同样的原因在“未同步”等待中工作 我的代码如下:C#-VS2010:如何在不阻塞UI的情况下做一些事情并等待一段时间?,c#,visual-studio-2010,C#,Visual Studio 2010,我正在制作一个简单的应用程序,我需要做一些事情,并更新一个进度条。我做一些事情,等待1秒,如果执行正常,我增加一个进度条,做一些其他事情,再等一秒钟,如果正常,增加进度条,以此类推,7次。这意味着我通过RS232连接到一个电子板,发送一些命令,然后执行,1秒钟后我检查板上的一切是否正常。我需要等一秒钟,等黑板上有类似的东西 问题在于等待那一秒钟。如果我使用Thread.Sleep(1000),整个UI会冻结(正如预期的那样),进度条也会因为同样的原因在“未同步”等待中工作 我的代码如下: pro
progressBar1.Value = 0;
/* Do some stuff */
Thread.Sleep(1000);
/* Check the stuff */
progressBar1.Value = 1;
/* Do some stuff */
Thread.Sleep(1000);
/* Check the stuff */
progressBar1.Value = 2;
/* Do some stuff */
Thread.Sleep(1000);
/* Check the stuff */
等等。。。7次
每一步的“材料”都是不同的
让我的代码等待1秒的最佳方法是什么
谢谢你的帮助 如果您的.NET Framework版本支持任务并行库(TPL),则应该使用它。这正是第三方物流旨在解决的问题。为此,您将启动一个异步任务,它是Thread类顶部的封装 从概念上讲,您应该为RS232板的连接创建一个新的线程。主线程(UI线程)保持执行,不会冻结UI。如果这是一个Windows应用程序,您应该阅读更多关于多线程编程的内容,因为在Windows应用程序中使用需要“同时”执行许多操作的单个线程将始终导致阻塞和冻结问题 如果.NET Framework版本不支持TPL,则应使用名为BackgroundWorker的类。下面是一个小示例,让您开始学习:
PS:我的回答是基于您正在编写Windows窗体应用程序的假设。下面是一个非常简单、精心设计的WinForms示例:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
namespace ProgressBar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnDoWork_Click(object sender, EventArgs e)
{
Task task1 = new Task(() => { System.Threading.Thread.Sleep(5000); });
Task task2 = new Task(() => { System.Threading.Thread.Sleep(5000); });
Task task3 = new Task(() => { System.Threading.Thread.Sleep(5000); });
Task task4 = new Task(() => { System.Threading.Thread.Sleep(5000); });
task1.ContinueWith((t) =>
{
if (t.Exception != null)
t.Exception.Handle(ex =>
{
//do something
return true;
});
progressBar.Value = 25;
}, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((t) => task2.Start());
task2.ContinueWith((t) =>
{
if (t.Exception != null)
t.Exception.Handle(ex =>
{
//do something
return true;
});
progressBar.Value = 50;
}, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((t) => task3.Start());
task3.ContinueWith((t) =>
{
if (t.Exception != null)
t.Exception.Handle(ex =>
{
//do something
return true;
});
progressBar.Value = 75;
}, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((t) => task4.Start());
task4.ContinueWith((t) =>
{
if (t.Exception != null)
t.Exception.Handle(ex =>
{
//do something
return true;
});
progressBar.Value = 100;
}, TaskScheduler.FromCurrentSynchronizationContext());
task1.Start();
}
}
}
基本上,只需为每个操作创建一个任务;然后在继续该任务时,检查(这一点非常重要,因为如果您没有检查它,并且出现异常,那么当任务被垃圾收集时,您的程序将崩溃)。在完成这一延续之后,只需启动下一个任务。如果需要从其中一个任务执行UI访问,请确保从CurrentSynchronizationContext调用该任务。1。查看线程/后台进程2。为什么要让代码等待1秒?什么类型的应用程序?Winforms?安慰Web?我不知道线程是什么。睡眠是用来做什么的,但很可能你想使用计时器+事件处理程序。相关:
等待任务。延迟(1000)
?