C#-如何更改次线程中进度条的值
在我的程序中,我在SqlBulkCopy类的帮助下将数百万条记录导入SQL Server数据库。由于这是一项繁重的工作,需要相当长的时间。当进程继续进行时,我想在progressbar控件中显示进度。要获得已复制行的通知,请执行以下操作:C#-如何更改次线程中进度条的值,c#,multithreading,C#,Multithreading,在我的程序中,我在SqlBulkCopy类的帮助下将数百万条记录导入SQL Server数据库。由于这是一项繁重的工作,需要相当长的时间。当进程继续进行时,我想在progressbar控件中显示进度。要获得已复制行的通知,请执行以下操作: ....... bulkCopy.NotifyAfter = 2000; bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied); ....... 现在在
.......
bulkCopy.NotifyAfter = 2000;
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
.......
现在在bulkCopy_SqlRowsCopied方法中,我想更改进度条的值。但我想我需要在另一条线上做。如何执行此操作?您可以在中执行副本,并使用
ReportProgress
更新进度栏…你可以在网站上找到一个例子
使用
BackgroundWorker
进行耗时的操作是很好的,因为您的UI(带有主线程)可以自由更新/刷新,从而改善用户体验。您可以在中执行副本,并使用ReportProgress
更新进度栏…你可以在网站上找到一个例子 使用
BackgroundWorker
进行耗时的操作是很好的,因为您的UI(带有主线程)可以自由更新/刷新,从而改善用户体验。使用EventHandler“bulkCopy\u SqlRowscoped”中的ProgressBar控件方法,确保将SqlBulkCopy类的属性设置为反映某种百分比形式的值
现在在bulkCopy_SqlRowsCopied方法中,我想更改进度条的值。但我想我需要在另一条线上做。我该怎么做
如果您使用的是.Net 4.0,则可以在任务中启动大容量复制,也可以在其他版本中使用线程池,创建自己的线程
Task.Factory.StartNew(MyBulkCopyMethod);
使用EventHandler“bulkCopy_SqlRowsCopied”中ProgressBar控件的方法,确保将SqlBulkCopy类的属性设置为反映某种百分比形式的值
现在在bulkCopy_SqlRowsCopied方法中,我想更改进度条的值。但我想我需要在另一条线上做。我该怎么做
如果您使用的是.Net 4.0,则可以在任务中启动大容量复制,也可以在其他版本中使用线程池,创建自己的线程
Task.Factory.StartNew(MyBulkCopyMethod);
对于非集合属性,WPF将为您将值打包到UI线程。因此,如果您的ViewModel具有引发PropertyChanged事件的ProgressBar属性,则可以将ProgressBar绑定到ProgressBar
为了实现这一点,ViewModel实例不应该是DependencyObject(但由于许多原因,这是一个坏主意)。通过这种方式,您可以从后台线程引用它并设置Progress属性。对于非集合属性,WPF将为您将该值整理到UI线程。因此,如果您的ViewModel具有引发PropertyChanged事件的ProgressBar属性,则可以将ProgressBar绑定到ProgressBar
为了实现这一点,ViewModel实例不应该是DependencyObject(但由于许多原因,这是一个坏主意)。这样,您可以从后台线程引用它并设置Progress属性。您可以有一个扩展类,如
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(); };
希望这对您有用。您可以有一个扩展类,如
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(); };
希望这对你有用。他为什么需要一个幕后工作人员?BulkCopy处理请求时,他声明的事件会在不同时间引发,具体取决于NotofyAfter属性。@Lloyd:如果他的
BulkCopy
是在主线程中执行的,则如果用户尝试执行某项操作,UI将不会更新,只有progressbar会更新。使用BackgroundWorker
可以让用户界面自由…为什么他需要一个BackgroundWorker?BulkCopy处理请求时,他声明的事件会在不同时间引发,具体取决于NotofyAfter属性。@Lloyd:如果他的BulkCopy
是在主线程中执行的,则如果用户尝试执行某项操作,UI将不会更新,只有progressbar会更新。使用BackgroundWorker
使UI变得自由。。。