Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-如何更改次线程中进度条的值_C#_Multithreading - Fatal编程技术网

C#-如何更改次线程中进度条的值

C#-如何更改次线程中进度条的值,c#,multithreading,C#,Multithreading,在我的程序中,我在SqlBulkCopy类的帮助下将数百万条记录导入SQL Server数据库。由于这是一项繁重的工作,需要相当长的时间。当进程继续进行时,我想在progressbar控件中显示进度。要获得已复制行的通知,请执行以下操作: ....... bulkCopy.NotifyAfter = 2000; bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied); ....... 现在在

在我的程序中,我在SqlBulkCopy类的帮助下将数百万条记录导入SQL Server数据库。由于这是一项繁重的工作,需要相当长的时间。当进程继续进行时,我想在progressbar控件中显示进度。要获得已复制行的通知,请执行以下操作:

.......
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变得自由。。。