如何从backgroundWorker报告字符串(如"正在搜索文件...","找到选择...")回到我的windows.form以及百分比.另外,我有一个包含我想在backgroundWorker_Work中运行的方法的大类.我可以通过Class_method()调用它; 但是我无法通过backgroundWorker_Work方法报告我完成的百分比或来自被调用类的任何内容.
谢谢!
我想中止该过程但不能这样做,我正在使用后台工作程序和我的处理功能.
public void Init()
{
bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
if (bw.CancellationPending == true)
{
e.Cancel = true;
}
else
{
e.Result = abd();
}
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled)
{
lbltext.content="Canceled";
}
else
{
lbltext.content="Completed";
}
}
private void btncan_Click(object sender, RoutedEventArgs e)
{
bw.CancelAsync();
}
private void btnstart_Click(object sender, RoutedEventArgs e)
{
bw.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
我无法使用此代码中止该过程.功能abd()正在执行处理部分并返回结果.
请给我任何解决方案. …
我的应用程序的用户将HTML类型转换为TextBox控件.
我希望我的应用程序在后台验证他们的输入.
因为我不想敲定验证服务,所以我尝试在每次验证之前建立一秒钟的延迟.
但是,我似乎无法正确中断已经运行的BackgroundWorker进程.
我的Visual Basic代码:
Sub W3CValidate(ByVal WholeDocumentText As String)
'stop any already-running validation
If ValidationWorker.IsBusy Then
ValidationWorker.CancelAsync()
'wait for it to become ready
While ValidationWorker.IsBusy
'pause for one-hundredth of a second
System.Threading.Thread.Sleep(New TimeSpan(0, 0, 0, 0, 10))
End While
End If
'start validation
Dim ValidationArgument As W3CValidator = New W3CValidator(WholeDocumentText)
ValidationWorker.RunWorkerAsync(ValidationArgument)
End Sub
看来在调用我的BackgroundWorker的CancelAsync()之后,它的IsBusy永远不会变为False.它陷入无限循环.
我究竟做错了什么?
for (do it a bunch of times)
{
while (backgroundWorker1.IsBusy && backgroundWorker2.IsBusy &&
backgroundWorker3.IsBusy && backgroundWorker4.IsBusy &&
backgroundWorker5.IsBusy)
{
System.Threading.Thread.Sleep(0001);
}
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
else if (!backgroundWorker2.IsBusy)
{
backgroundWorker2.RunWorkerAsync();
}
else if (!backgroundWorker3.IsBusy)
{
backgroundWorker3.RunWorkerAsync();
}
else if (!backgroundWorker4.IsBusy)
{
backgroundWorker4.RunWorkerAsync();
}
else if (!backgroundWorker5.IsBusy)
{
backgroundWorker5.RunWorkerAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
它运行五次(每个BG工作一次)并且一直卡住.背景工作者不要再忙吗?我如何查看空房情况?
注意:有5个工作线程,这可以确保它们都不会停止,总是为它们分配工作.但他们拒绝告诉我什么时候可用,我认为这将有一个简单的解决方案..
- [编辑请求] ---
实际上它只是一个虚拟参数,我删除它并忘了把它拿出来,我只用它来调用dowork,谁做了脏工作:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
timeconsumingfunction(publicstring);
}
Run Code Online (Sandbox Code Playgroud)
时间消耗功能结束了.在调试器中逐步进入它并在每行运行一行,直到结束并到达最后的'}'.这意味着它结束了吧?
--- [编辑答案] ----它通过JUST替换线路
System.Threading.Thread.Sleep(0001);
Run Code Online (Sandbox Code Playgroud)
同
Application.DoEvents();
Run Code Online (Sandbox Code Playgroud)
我想它会运行后台,但没有收到答案,也没有更新IsBusy标签.
谢谢大家,很棒的答案,帮了很多忙!
我有一名背景工作者.在我调用worker之前,我禁用了一个按钮并使gif可见.然后我调用runworkerasync方法,它运行正常,直到comleteion.在'RunWorkerCompleted()'上我得到一个跨线程错误.知道为什么吗?
private void buttonRun_Click(object sender, EventArgs e)
{
if (comboBoxFiscalYear.SelectedIndex != -1 && !string.IsNullOrEmpty(textBoxFolderLoc.Text))
{
try
{
u = new UpdateDispositionReports(
Convert.ToInt32(comboBoxFiscalYear.SelectedItem.ToString())
, textBoxFolderLoc.Text
, Properties.Settings.Default.TemplatePath
, Properties.Settings.Default.ConnStr);
this.buttonRun.Enabled = false;
this.pictureBox1.Visible = true;
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
//backgroundWorker1.RunWorkerAsync();
}
catch (Exception ex)
{
MessageBox.Show("Unable to process.\nError:" + ex.Message, Properties.Settings.Default.AppName);
}
}
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
buttonRun.Enabled = true;
pictureBox1.Visible = false;
}
void bw_DoWork(object sender, DoWorkEventArgs …Run Code Online (Sandbox Code Playgroud) 我正在使用xcopy编写备份程序,因为有很多大文件需要一段时间,所以我想显示进度.当我尝试使用StreamReader获取标准输出时,我在调试时会出现此错误消息."不能在流程流上混合同步和异步操作."
public void backup_worker_DoWork(object sender, DoWorkEventArgs e)
{
int loop = 1;
backup_worker.WorkerReportsProgress = true;
Process xcopy = new Process();
ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.CreateNoWindow = true;
startinfo.UseShellExecute = false;
startinfo.RedirectStandardError = true;
startinfo.RedirectStandardOutput = true;
startinfo.FileName = Environment.CurrentDirectory + "\\xcopy.exe";
startinfo.Arguments = '"' + source + '"' + " " + '"' + target + '"' + " " + "/s /e /y";
xcopy.StartInfo.RedirectStandardOutput = true;
xcopy.StartInfo = startinfo;
xcopy.Start();
xcopy.BeginErrorReadLine();
xcopy.BeginOutputReadLine();
StreamReader sr = xcopy.StandardOutput;
while (loop …Run Code Online (Sandbox Code Playgroud) 当我的应用程序启动时,它刚刚升级,我正在进行本地数据库更新(sqlite).
它是这样的:用户启动我的应用程序,然后我开始升级过程.在此升级过程中,我将显示一个具有连续进度条的表单.升级过程完成后,此表单将关闭,然后用户可以开始使用我的应用程序.
但由于升级过程非常密集,因此进度条不会生成动画.
在我的旧版VB6中,我使用了一个ActiveX-Exe,它有一个表单并显示一个进度条.这是我的"背景工作者".
我不确定我是否可以在VB.NET中使用相同的方法.
我只看到了后台工作者的工作,但我没有看到任何示例,其中progressbar本身是后台工作者.
数据库升级需要阻止,用户可能在数据库升级完成之前不使用我的应用程序.这意味着只有进度条应该"进行中",而不是升级.
非常感谢你!
我在WPF应用程序中的后台工作者中意识到了一些奇怪的东西.
我现在想要完成的是等到BW完成另一个线程.
检查以下代码:
if (bw.IsBusy)
{
bw.CancelAsync();
System.Threading.ThreadStart WaitThread =
new System.Threading.ThreadStart(delegate() {
while (bw.IsBusy)
{
System.Threading.Thread.Sleep(100);
}
bw.RunWorkerAsync();
});
System.Windows.Application.Current.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
WaitThread); // if I remove this line, bw fires RunWorkerAsyncEvent
}
else
{
bw.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
请注意,我添加了一个Dispatcher.Invoke,等到bw不忙,但如果我调用它并且从不触发RunWorkerAsyncCompleted事件,则所有时间都很忙.虽然,如果我删除该行,FIRES事件,这真的很奇怪.
我怎么能等到bw结束?
我对如何处理异常感到有些困惑.
我有一个后台工作线程,运行一些长时间运行的进程.我的理解是,如果后台工作线程发生异常,代码仍将以RunWorkerCompleted方法结束.
void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,那么在bgWorker.RunWorkerAsync()周围放置一个try catch块是有意义的.打电话,我猜不是吗?
我想重新抛出RunWorkerCompleted方法中捕获的异常,如何在不丢失堆栈跟踪的情况下执行此操作 - 我上面的内容是否正确?我读过你,当你重新抛出异常时,你应该只使用"抛出"?
我们在带有SQL Server 2016的ASP.NET Web项目中使用Hangfire 1.7.2。我们的服务器上大约有150个站点,每个站点都使用Hangfire 1.7.2。我们注意到,当我们升级这些站点以使用Hangfire时,数据库服务器崩溃了。查看数据库日志,我们发现有多个锁定查询。我们在所有阻止会话中都标识了一个RPC事件“ sys.sp_getapplock; 1”。看来Hangfire锁定了我们的数据库,使整个数据库无法使用。由于Hangfire,我们注意到将近670多个锁定查询。
这可能是由于我们设置了以下属性:
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(30),
QueuePollInterval = TimeSpan.FromHours(5)
Run Code Online (Sandbox Code Playgroud)
每个站点大约有20个后台作业,其中一些每分钟运行一次,而另一些每小时,每6小时运行一次,每天运行一次。
我已经搜索了文档,但是找不到任何可以解释这两个属性或如何设置它们以避免数据库锁定的内容。
在这方面寻求帮助。
编辑:每秒执行以下查询:
exec sp_executesql N'select count(*) from [HangFire].[Set] with (readcommittedlock, forceseek) where [Key] = @key',N'@key nvarchar(4000)',@key=N'retries'
select distinct(Queue) from [HangFire].JobQueue with (nolock)
exec sp_executesql N'select count(*) from [HangFire].[Set] with (readcommittedlock, forceseek) where [Key] = @key',N'@key nvarchar(4000)',@key=N'retries'
Run Code Online (Sandbox Code Playgroud)
不管我们设置的时间跨度值的各种组合如何。这是我们正在使用的GetHangfirServers的代码:
public static IEnumerable<IDisposable> GetHangfireServers()
{
// Reference for GlobalConfiguration.Configuration: http://docs.hangfire.io/en/latest/getting-started/index.html
// Reference for UseSqlServerStorage: http://docs.hangfire.io/en/latest/configuration/using-sql-server.html#configuring-the-polling-interval
GlobalConfiguration.Configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(ConfigurationManager.ConnectionStrings["abc"]
.ConnectionString, new SqlServerStorageOptions
{
CommandBatchMaxTimeout = …Run Code Online (Sandbox Code Playgroud) backgroundworker ×10
c# ×8
.net ×2
dispatch ×1
dispatcher ×1
hangfire ×1
process ×1
progress ×1
progress-bar ×1
reporting ×1
sql-server ×1
vb.net ×1
vsto ×1
wpf ×1