C#-如何更改辅助线程中进度条的值
本文关键字:线程 何更改 C#- | 更新日期: 2023-09-27 18:21:04
在我的程序中,我在SqlBulkCopy类的帮助下将数百万条记录导入SQL Server数据库。由于这是一项繁重的工作,需要相当长的时间。当这个过程继续进行时,我想在进度条控件中显示进度。为了得到复制行的通知,我已经这样做了:
.......
bulkCopy.NotifyAfter = 2000;
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
.......
现在,在bulkCopy_SqlRowsCopied方法中,我想更改进度条的值。但我想我需要把它放在另一条线上。我该怎么做?
您可以有一个扩展类,如
public static class ControlExtensions
{
public static void Invoke(this Control control, Action action)
{
if (control.InvokeRequired) control.Invoke(new MethodInvoker(action), null);
else action.Invoke();
}
}
现在,无论何时何地,你都可以更新进度条的状态,你可以进行
progressBar.Invoke(() => { progressBar.PerformStep(); };
希望这对你有用。
您可以在BackgroundWorker中执行副本,并使用ReportProgress
更新进度条
您可以在中找到示例http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx.
使用BackgroundWorker
进行耗时的操作是很好的,因为您的UI(带有主线程)可以自由更新/刷新,从而提高用户体验。
对于非集合属性,WPF将把值编组到UI线程中。因此,如果您的ViewModel具有引发PropertyChanged事件的进度属性,则可以将ProgressBar绑定到ProgressBar。
为了实现这一点,ViewModel实例不应该是DependencyObject(但由于多种原因,这是个坏主意)。通过这种方式,您可以从后台线程引用它并设置Progress属性。
使用EventHandler"bulkCopy_SqlRowsCopied"中ProgressBar控件的Invoke()方法,确保将SqlBulkCopy类的NotifyAfter属性设置为反映某种百分比形式的值。
现在,在bulkCopy_SqlRowsCopied方法中,我想更改进度条的值。但我想我需要把它放在另一条线上。我该怎么做?
如果你使用的是.Net 4.0,你可以在Task中启动批量复制,其他版本你可以使用ThreadPool,创建你自己的线程
Task.Factory.StartNew(MyBulkCopyMethod);