标签: backgroundworker

我该如何等待BackgroundWorker?

我有一个方法Foo(),它创建并运行一个BackgroundWorker.
RunWorkerCompleted,ProgressChanged等被内部处理Foo().

我的主线程调用MyObject.Foo().
在调用MyObject.Foo()主线程调用之后MyObject.DoSthWithFooData().

主线程对BackgroundWorker内部一无所知MyObject.Foo().

如何强制主线程等到BackgroundWorker完成其工作?

DoSthWithFooData()必须在BackgroundWorkerin MyObject.Foo()完成其工作时调用.

c# synchronization backgroundworker

2
推荐指数
1
解决办法
1398
查看次数

为什么不能从后台工作者访问UI组件?

线程都共享资源.这是围绕多线程操作的整个问题.

MSDN说:

您必须小心不要操作DoWork事件>处理程序中的任何用户界面对象.而是通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信.

BackgroundWorker事件不是跨AppDomain边界编组的.不要使用BackgroundWorker组件在多个AppDomain中执行多线程操作.

然而,当我使用backgroundworker时,并不是我需要小心不要操纵任何UI对象,如果我尝试从DOWork事件中访问UI组件,那就不行了.代码编译,但是当DoWork的代码运行时,我收到一个错误:

跨线程操作无效:控制从其创建的线程以外的线程访问的"utAlerts".

MSDN没有说明这是怎么做的或为什么.backgroundworker是否装饰了一些阻止这种情况的属性?这是如何完成的?

.net c# user-interface backgroundworker

2
推荐指数
1
解决办法
3425
查看次数

如何在执行功能期间使应用程序加载屏幕

我想在执行功能期间创建加载屏幕 - 比如在游戏,新窗口或某些图形中加载屏幕.

所以我按下按钮"开始" - 应用程序开始做一些东西,子窗体窗口显示图形 - "功能正在进行中,请稍候"

怎么做?

.net c# multithreading backgroundworker winforms

2
推荐指数
1
解决办法
8656
查看次数

如何修改.net的BackgroundWorker类,以便在方法完成时触发自定义事件

我在vb.net程序中有一个BackgroundWorker,它正在进行冗长的数据导入例程.我想修改其RunWorkerAsync方法,以便在完成该方法时触发自定义事件.(这样自动化过程中的方法可以响应事件并恢复其工作).从某种意义上说,我想"扩展"RunWorkerAsync方法以添加额外的代码行 - 但是我无法"看到"方法中的代码(只是添加引发事件的行),因为BackgroundWorker是一个MSDN类来自微软.

我能想到的唯一解决方案是将后台工作者类"包装"在一个调用.RunWorkerAsync方法的包装器中,然后引发该事件.

Public sub wrapperMethod()
    myBackgroundWorker.RunWorkerAsync()
    raise customEvent
end sub
Run Code Online (Sandbox Code Playgroud)

我可能会使用一种设计模式吗?使用.net语言解决这个问题的简单方法是什么?

PS:不幸的是,我正在自动化一些叮当作响的遗留软件,并且在许多地方都使用了后台工作程序,因此包装后台工作程序将会有一些工作并且可能会打开错误.

.net vb.net design-patterns backgroundworker

2
推荐指数
1
解决办法
810
查看次数

backgroundWorker和progressChanged无法正常工作

我不能让进度条工作!如果我执行以下代码,即使代码被执行,条形仍然为空,ReportProgress似乎没有更新任何东西..:

namespace GPUZ_2

{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        GPUZdata test = new GPUZdata
        {
        };

        //invio l'oggetto al thread backgroundworker
        backgroundWorker1.RunWorkerAsync(test);
    }


    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        //
        // e.Argument always contains whatever was sent to the background worker
        // in RunWorkerAsync. We can simply cast it to its original type.
        //
        GPUZdata argumentTest = e.Argument as GPUZdata;




        argumentTest.OneValue = 6;
        Thread.Sleep(2000);
        backgroundWorker1.ReportProgress(50);
        argumentTest.TwoValue = 3;
        Thread.Sleep(2000);
        backgroundWorker1.ReportProgress(100);


        //
        // Now, …
Run Code Online (Sandbox Code Playgroud)

c# backgroundworker progress-bar

2
推荐指数
1
解决办法
9570
查看次数

链的多个背景工作者

我有一系列3个耗时的函数,我想在后台工作者或其他任何工具中执行它们,我的问题是每个函数都应该等待先前函数完成,所以这是我的伪代码:

open_session() // during the execution of this function i like to display a loading-window 

open_session() //this function opens a process another windows app , while opening this app i would like to keep the current app responsive.

close_session()// during the execution of this function i like to display a loading-window 
Run Code Online (Sandbox Code Playgroud)

我想用背景工作者做这个,但功能是异步的.

请帮忙

.net c# multithreading backgroundworker

2
推荐指数
1
解决办法
2246
查看次数

如何将此函数放在单独的线程中

我需要一点(或大)帮助我的表单:我需要在一个单独的线程中使用"组织功能"区域内的所有内容.

我在表单的"开始按钮"区域按下一个按钮,调用"组织功能"子组件的第一个子组; 第一个子调用第二个子,第二个子调用第三个子.

我尝试自己将第三个子句添加到一个单独的线程中,然后使用第二个子句将参数传递给线程,但我所做的一切都是错误的.

有人可以帮我这样做吗?

PS:我已删除此表单中的非重要部分,以便您更好地检查.

谢谢你的阅读.

Public Class Form1


#Region "Declarations"

        ' MediaInfo
        Dim MI As MediaInfo

        ' Thread
        Dim paused As Boolean = False

        ' Others
        Dim NameOfDirectory As String = Nothing
        Dim aFile As FileInfo

#End Region



    'thread
    Dim t As New Thread(AddressOf ThreadProc)

    Public Sub ThreadProc()
        ' Aqui debería ir  todo el sub de "organize function", bueno... son 3 subs!
        If paused = True Then MsgBox("THREAD PAUSADO")
    End Sub



#Region "Properties"
...
#End Region

#Region "Load …
Run Code Online (Sandbox Code Playgroud)

vb.net multithreading backgroundworker visual-studio

2
推荐指数
1
解决办法
1万
查看次数

如何在C#中使用BackgroundWorker

如何在C#中使用BackgroundWorker?

实际上我正在执行一个从称为的方法填写PDF表单的操作fill().将结果显示到pdfviewer需要更多时间,因此我决定使用backgroundworker显示"处理图像",并尝试使用它但未能实现它

这是我的代码片段:

        private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Invoke((MethodInvoker)delegate()
           {
               ???? 
           }); 
        }

        private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          if (e.Cancelled == true)
          {
          }
          else if (e.Error != null)
          {
          }
          else
          {
           picLoading.SendToBack();
          }
       }
Run Code Online (Sandbox Code Playgroud)

单击按钮FILL时调用填充方法

private void btnFill_Click(object sender, EventArgs e)
        {
            if (btnFill.Text == "Fill")
            { 
                bgwLoadFile.RunWorkerAsync();
                picloading.BringToFront();

                Fill();
            }
Run Code Online (Sandbox Code Playgroud)

我需要在DoWork方法中添加wat语句,如果我试图添加FILL()填充被调用两次...

谁能帮我吗

谢谢

c# backgroundworker

2
推荐指数
1
解决办法
1万
查看次数

使用BackgroundWorker的请求似乎永远不会完成

我为我的登录表单创建了一个加载窗口,我使用BackgroundWorker来制作一个平滑的加载动画,但是如果我使用ShowDialog()insted Show(),加载窗口会保留在屏幕上,程序什么都不做.是什么导致了这个?

在这里,我调用BackgroundWorker,然后显示Loading页面:

private void loginButton_Click(object sender, EventArgs e) {
    loadscr.Show();
    LoginBV.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)

在这里我关闭加载窗口:

private void LoginBV_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    loadscr.Close();
    //and show the MainWindow, etc.
}
Run Code Online (Sandbox Code Playgroud)

DoWork(BackgroundWorker)代码:

    private void LoginBV_DoWork(object sender, DoWorkEventArgs e) {
        NameValueCollection POST = new NameValueCollection();
        POST["username"] = ipbUN.Text;
        POST["password"] = ipbPASS.Text;
        POST["pin"] = ipbPIN.Text;
        POST["csoport"] = "user";

        var action = Program.startPOST<DataObj>("http://localhost/system/winapi.php?do=userlogin", POST);

        finish["sessionkey"] = action.sessionkey;
        finish["status"] = Convert.ToString(action.status);
    }
Run Code Online (Sandbox Code Playgroud)

c# backgroundworker

2
推荐指数
1
解决办法
187
查看次数

与背景工作者的VB NET问题

当我的后台工作人员正在完成他的工作时,我想更改主要表单中的标签,告诉他们当时正在采取什么流程.

该应用程序适用于某些文件,因此我需要传递应用程序正在处理的文件的信息.

我的背景工作者

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    If (Not System.IO.Directory.Exists(caminho & "\results")) Then
        System.IO.Directory.CreateDirectory(caminho & "\results")
    End If
    For Each folder As String In System.IO.Directory.GetDirectories(caminho)
        Dim split As String() = folder.Split("\")
        Dim parentFolder As String = split(split.Length - 1)
        If (Not System.IO.Directory.Exists(caminho & "\results" & "\" & parentFolder)) Then
            System.IO.Directory.CreateDirectory(caminho & "\results" & "\" & parentFolder)
        End If
        For Each file As String In System.IO.Directory.GetFiles(folder)
            output = file
            'Dim imgFile As System.Drawing.Image = System.Drawing.Image.FromFile(file) …
Run Code Online (Sandbox Code Playgroud)

vb.net backgroundworker

2
推荐指数
1
解决办法
84
查看次数