我有一个运行长数据库任务的后台工作程序.我想在任务运行时显示进度条.不知何故,后台工作人员不会报告任务的进度.
这就是我所拥有的:
BackgroundWorker _bgwLoadClients;
_bgwLoadClients = new BackgroundWorker();
_bgwLoadClients.WorkerReportsProgress = true;
_bgwLoadClients.DoWork += new DoWorkEventHandler(_bgwLoadClients_DoWork);
_bgwLoadClients.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bgwLoadClients_RunWorkerCompleted);
_bgwLoadClients.ProgressChanged += new ProgressChangedEventHandler(_bgwLoadClients_ProgressChanged);
_bgwLoadClients.RunWorkerAsync(parms);
private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dt = getdate();
e.Result = dt;
}
void _bgwLoadClients_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)
我在WPF中这样做,但我想它不会有所作为.
提前致谢
我已经编写了一个示例控制台应用程序来使用Stackoverflow中发布的示例之一来测试backgroundworker.我有一个backgroundworker,它以main方法开头,但是如果我按下回车键,它会在操作过程中结束,因为我在main方法中写了一个console.readkey.但是我希望它等到后台工作者完成工作然后退出应用程序.这是我的代码.
class Program
{
private static BackgroundWorker worker = new BackgroundWorker();
private event EventHandler BackgroundWorkFinished;
static void Main(string[] args)
{
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
Console.WriteLine("Starting Application...");
worker.RunWorkerAsync();
Console.ReadKey();
}
static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage.ToString());
}
static void worker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine("Starting to do some work now...");
int i;
for (i = 1; i < 10; i++)
{
Thread.Sleep(1000);
worker.ReportProgress(Convert.ToInt32((100.0 * i) / 10));
} …Run Code Online (Sandbox Code Playgroud) 我的一般设置:我们编写了一个带有小gui的excel导入器,允许非程序员使用"Button.Click"等命令编写和执行gui-tests.底层框架是TestStack.White.在导入excel文件和一些其他用户交互之后,测试在System.ComponentModel.BackgroundWorker内启动,只要我不查看(或甚至与包含大量childelements的元素交互),它就可以正常工作.
但是,只要我与TestStack.White.UIItems.WindowItems.Window或具有大量元素的TestStack.White.UIItems.UIItemContainer进行交互,testexecution就会结束.
通过交互,我的意思是从简单的东西,如非空检查或分配到局部变量或类似要求它的子计数.结束测试的一些例子:1)
if(theElement != null){ //everything after this line does not happen. The operator doesn't seem to be overloaded
doStuff(); //it never reaches this point
}
Run Code Online (Sandbox Code Playgroud)
2)
UIItemContainer pointOfInterest = theElement; //everything after this line does not happen
Run Code Online (Sandbox Code Playgroud)
3)
System.Diagnostics.Debug.WriteLine("AmountOfElements: " + UIAnchor.Items.Count); //the output doesn't come. everything after this line does not happen
Run Code Online (Sandbox Code Playgroud)
在没有数百个元素的窗口中,所有三个示例都按预期工作.
我的意思是很多元素,例如一个内部有ScrollView的Window,它有一个包含数十个甚至数百个条目的表,其中每个条目包含3-4列文本或复选框或类似的东西.
BackgroundWorkers RunWorkerCompleted以及Disposed也不会被调用.我没有得到任何异常,即使有目的地放置了try/catch块我也没有得到任何东西.调试器到达导致问题的那一行,就是这样.之后没有任何事情发生,即使等待1小时.
相反,我得到了几个不同的"线程{某些十六进制ID}已退出代码259(0x103)." 在Visual Studio的输出窗口中.这是我上次的测试执行:
The thread 0x830 has exited with code 259 (0x103).
The thread 0xfc0 has exited with code 259 (0x103). …Run Code Online (Sandbox Code Playgroud) C#2008 SP1
我正在使用后台工作者
如果其中一个条件失败,我将e.cancel设置为true,并将字符串分配给e.result.一切都在那里工作.
但是,当workCompleted触发时,我测试了e.Result并且我得到一个异常"e.result抛出systeminvalidoperation类型的异常".
我想我可以使用全局变量在DoWork中设置并在完成的工作中进行比较.但这可能不是线程安全的.
任何人都可以告诉我为什么我用e.Result得到这个,我该如何解决这个问题?
非常感谢,
private void bgwPrepareCall_DoWork(object sender, DoWorkEventArgs e)
{
// Check to see if the called number is blocked.
// If the nubmer is blocked display error message.
if (this.IsNoGateway(sipUsername, statusDisplay1.PhoneNumber))
{
// this.SetIdleState(DialerErrorMessage.GetErrorDescription(12));
e.Cancel = true;
e.Result = "NoGateway";
return;
}
if (!this.IsInvalidTelephoneNumber(sipUsername, statusDisplay1.PhoneNumber))
{
// this.SetIdleState(DialerErrorMessage.GetErrorDescription(13));
e.Cancel = true;
e.Result = "InvalidNumber";
return;
}
}
private void bgwPrepareCall_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
if (e.Cancelled)
{
// Failed …Run Code Online (Sandbox Code Playgroud) 在我的Windows应用程序启动期间,我必须调用Web服务来检索一些默认数据以加载到我的应用程序中.在加载表单期间,我运行后台工作程序来检索此数据.我想显示等待光标,直到检索到这些数据.我该怎么做?
我已经尝试在调用backgroundworker运行之前设置等待光标.当我报告100的进度时,我将其设置回默认光标.等待光标出现但是当我移动鼠标时它会消失.
环境:
编辑:我按照Jay Riggs建议的方式设置光标.它只有在我不移动鼠标时才有效.
**更新:我创建了一个单击按钮,执行以下操作:当我按下按钮并单击并移动鼠标时,无论我是否移动鼠标,都会出现等待光标.
void BtnClick()
{
Cursor = Cursors.WaitCursor;
Thread.Sleep(8000);
Cursor = Cursors.Default;
}
Run Code Online (Sandbox Code Playgroud)
如果我执行以下操作:我看到等待光标,当我移动鼠标时,它会消失在窗体内.如果我移动到状态栏或菜单栏,则会出现等待光标.
Cursor = Cursors.WaitCursor;
if (!backgroundWorker.IsBusy)
{
backGroundWorker.RunWorkerAsync();
}
void backGroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(8000);
}
void backGroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Cursor = Cursors.Default;
}
Run Code Online (Sandbox Code Playgroud)
如果我执行以下操作:等待光标出现,当我移动鼠标时它仍然出现,但有时在文本字段中移动时会闪烁关闭和打开.虽然光标变为等待光标,但它不会阻止您单击任何内容.
if (!backgroundWorker.IsBusy)
{
backGroundWorker.RunWorkerAsync();
}
void backGroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
UseWaitCursor = true;
Thread.Sleep(8000);
}
void backGroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
UseWaitCursor = false;
}
Run Code Online (Sandbox Code Playgroud) 我经常有一些代码应该按计划运行或作为带有一些参数的后台进程运行.常见的元素是它们在调度过程之外运行,但需要访问Rails环境(可能还有传入的参数).
有什么好办法组织这个以及为什么?如果您想使用特定的插件或gem,请解释为什么您觉得它很方便 - 不要只列出您使用的插件.
我有以下问题:
我有一个名为MainForm的表单.我在这张表格上进行了长时间的操作.
虽然这个长时间的操作正在进行,但我需要在MainForm之上显示另一个名为ProgressForm的操作.
ProgressForm包含一个进度条,需要在长时间操作时进行更新.
长操作完成后,应自动关闭ProgressForm.
我写了以下代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace ClassLibrary
{
public class MyClass
{
public static string LongOperation()
{
Thread.Sleep(new TimeSpan(0,0,30));
return "HelloWorld";
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BackgroungWorker__HelloWorld
{
public partial class ProgressForm : Form
{
public ProgressForm()
{
InitializeComponent();
}
public ProgressBar ProgressBar
{
get { return this.progressBar1; }
set { this.progressBar1 = value; }
} …Run Code Online (Sandbox Code Playgroud) 我有一个后台工作程序控件,用于执行任务,并使用委托过程更新主UI上的多行文本框.这是所有正常使用,但一旦更新滚动出文本框的底部,滚动条出现,但持续清爽使文本框上方保持锁定状态.理想情况下,我希望文本框自动滚动到底部以实时显示最新条目.实现这个的最佳方法是什么?
我已尝试使用该scrolltocaret()方法,有或没有在SelectionStart = txtlog.Text.Length它之前的命令.也许我把它放在错误的地方?
下面是一些代码示例:
委托代码:
Delegate Sub updateresults_delegate(ByVal textbox As TextBox, ByVal text As String)
Private Sub updatelog_threadsafe(ByVal textbox As TextBox, ByVal text As String)
If textbox.InvokeRequired Then
Dim mydelegate As New updateresults_delegate(AddressOf updatelog_threadsafe)
Me.Invoke(mydelegate, New Object() {textbox, text})
'Me.txtlog.SelectionStart = txtlog.Text.Length
'Me.txtlog.ScrollToCaret()
Else
textbox.Text = text
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
主要背景工作者活动:
For i As Integer = val1 To val2
'generate an IP address from split host parts and current value of i
host = …Run Code Online (Sandbox Code Playgroud) 我需要能够继续运行我的BackgroundWorker.该DoWork事件包含池线程进程并OnComplete更新我的UI.
在BackgroundWorker.RunWorkerAsync()没有整个程序冻结的情况下,我无法找到无限循环方法的方法.任何帮助将不胜感激.
我在node.js中编写游戏服务器,有些操作涉及部分服务器的大量计算.我不想在运行这些计算时停止接受连接 - 当node.js不支持线程时,如何在后台运行它们?