我有一个方法Foo(),它创建并运行一个BackgroundWorker.
RunWorkerCompleted,ProgressChanged等被内部处理Foo().
我的主线程调用MyObject.Foo().
在调用MyObject.Foo()主线程调用之后MyObject.DoSthWithFooData().
主线程对BackgroundWorker内部一无所知MyObject.Foo().
如何强制主线程等到BackgroundWorker完成其工作?
DoSthWithFooData()必须在BackgroundWorkerin MyObject.Foo()完成其工作时调用.
线程都共享资源.这是围绕多线程操作的整个问题.
MSDN说:
您必须小心不要操作DoWork事件>处理程序中的任何用户界面对象.而是通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信.
BackgroundWorker事件不是跨AppDomain边界编组的.不要使用BackgroundWorker组件在多个AppDomain中执行多线程操作.
然而,当我使用backgroundworker时,并不是我需要小心不要操纵任何UI对象,如果我尝试从DOWork事件中访问UI组件,那就不行了.代码编译,但是当DoWork的代码运行时,我收到一个错误:
跨线程操作无效:控制从其创建的线程以外的线程访问的"utAlerts".
MSDN没有说明这是怎么做的或为什么.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:不幸的是,我正在自动化一些叮当作响的遗留软件,并且在许多地方都使用了后台工作程序,因此包装后台工作程序将会有一些工作并且可能会打开错误.
我不能让进度条工作!如果我执行以下代码,即使代码被执行,条形仍然为空,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) 我有一系列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)
我想用背景工作者做这个,但功能是异步的.
请帮忙
我需要一点(或大)帮助我的表单:我需要在一个单独的线程中使用"组织功能"区域内的所有内容.
我在表单的"开始按钮"区域按下一个按钮,调用"组织功能"子组件的第一个子组; 第一个子调用第二个子,第二个子调用第三个子.
我尝试自己将第三个子句添加到一个单独的线程中,然后使用第二个子句将参数传递给线程,但我所做的一切都是错误的.
有人可以帮我这样做吗?
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) 如何在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()填充被调用两次...
谁能帮我吗
谢谢
我为我的登录表单创建了一个加载窗口,我使用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) 当我的后台工作人员正在完成他的工作时,我想更改主要表单中的标签,告诉他们当时正在采取什么流程.
该应用程序适用于某些文件,因此我需要传递应用程序正在处理的文件的信息.
我的背景工作者
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)