为了将数据传递到BackgroundWorker的DoWork我使用一个单独的包装类"实例:
MyParams mpar = new MyParams();
...
mpar.Par1 = par1val;
mpar.Par2 = par2val;
mpar.Par3 = par3val;
...
var worker1 = new System.ComponentModel.BackgroundWorker();
worker1.DoWork += new DoWorkEventHandler(worker1_DoWork);
worker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker1_RunWorkerCompleted);
worker1.RunWorkerAsync(mpar);
Run Code Online (Sandbox Code Playgroud)
然后我可以使用mpar实例的参数worker1_DoWork,在另一个线程中操作.
void worker1_DoWork(object sender, DoWorkEventArgs e)
{
//here we use mpar.Par1, mpar.Par2 and so on
}
Run Code Online (Sandbox Code Playgroud)
在RunWorkerCompletedEventHandler我们做的UI线程一些postactions.
我的问题是:我们可以在RunWorkerCompleted处理程序中使用它在处理程序mpar之前工作的实例,DoWork我们可以确定它的值与它的相同DoWork吗?如果不是,那么为各个BackgroundWorker操作阶段共享参数的正确方法是什么?
void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Dispatcher.BeginInvoke((Action)(() =>
{
//Can …Run Code Online (Sandbox Code Playgroud) MVVM的一个好处是ViewModel的可测试性.在我的特定情况下,我有一个VM,它在调用命令时加载一些数据,以及相应的测试:
public class MyViewModel
{
public DelegateCommand LoadDataCommand { get; set; }
private List<Data> myData;
public List<Data> MyData
{
get { return myData; }
set { myData = value; RaisePropertyChanged(() => MyData); }
}
public MyViewModel()
{
LoadDataCommand = new DelegateCommand(OnLoadData);
}
private void OnLoadData()
{
// loads data over wcf or db or whatever. doesn't matter from where...
MyData = wcfClient.LoadData();
}
}
[TestMethod]
public void LoadDataTest()
{
var vm = new MyViewModel();
vm.LoadDataCommand.Execute();
Assert.IsNotNull(vm.MyData);
}
Run Code Online (Sandbox Code Playgroud)
所以这一切都很简单.但是,我真正想做的是使用a加载数据BackgroundWorker,并在屏幕上显示"加载"消息.所以我将VM更改为: …
我对.NET编程和多线程一般都比较陌生,并且想知道是否可以使用.NET提供的BackgroundWorker来产生工作线程来在控制台应用程序中做一些工作?从在线的各种文档中,我看到这个类的意图更多的是面向UI的应用程序,你想在后台做一些工作,但保持UI响应,报告进度,取消处理,如果需要等.
在我的情况下,基本上我有一个控制器类,我想在多个工作线程中产生一些处理(限制使用信号量产生的最大工作线程数).然后我希望我的控制器类阻塞,直到所有线程都完成处理.所以在我启动一个工作线程做一些工作后,我希望线程能够在处理完成时通知控制器线程.我看到我可以使用后台工作者类,并处理事件DoWork和RunWorkerCompleted来实现这一点,但是想知道这是不是一个好主意?有没有更好的方法来实现这一目标?
我的WinForm调用一个执行一些复制操作的类.我想在表格上展示这方面的进展.
我想使用Backgroundworker,但我不知道如何报告从课程到表单的进度(/ backgroundworker)
我正在使用一个streamwriter与后台工作者一起进行日志记录.
就这样,我有
System::Void
MyUI::execBWorker_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e) {
String^ outputPath = _clr::Settings::ApplicationLogPath("_log.txt", true, false);
logfile_ = gcnew StreamWriter(outputPath,true);
DoStuff();
logfile_->Close();
}
Run Code Online (Sandbox Code Playgroud)
DoStuff()方法中的内容引发了Progress事件.
System::Void
MyUI::execBWorker_ProgressChanged(System::Object^ sender, System::ComponentModel::ProgressChangedEventArgs^ e) {
logfile_->WriteLine("something");
}
Run Code Online (Sandbox Code Playgroud)
我觉得这真的很有气味.我怎样才能让它变得更好,或者至少如何检查日志文件是否尚未关闭?有很多消息,所以我担心连续打开和关闭日志文件.
简单的问题,重复标题:
关闭WinForms应用程序是否会停止所有活动的BackgroundWorkers?
当我的C#应用程序关闭时,它有时会陷入清理例程.具体来说,后台工作人员没有关闭.这基本上就是我试图关闭它的方式:
private void App_FormClosing(object sender,FormClosingEventArgs e){backgroundWorker1.CancelAsync(); 而(backgroundWorker1.IsBusy); //被困在这里 }
我应该采取不同的方式吗?我使用的是Microsoft Visual C#2008 Express Edition.谢谢.
附加信息:
后台工作人员似乎没有退出.这就是我所拥有的:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)
{
// Do something.
}
}
Run Code Online (Sandbox Code Playgroud)
我还修改了清理代码:
private void App_FormClosing(object sender, FormClosingEventArgs e)
{
while (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
System.Threading.Thread.Sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
我还应该做些什么吗?
我想在从SQL数据库中读取数据时通知用户,我决定使用进度条创建一个表单,但它不起作用 - 可能是因为需要一个线程.我想以编程方式创建表单
ProgressBar pb = new ProgressBar();
pb.MarqueeAnimationSpeed = 30;
pb.Style = ProgressBarStyle.Marquee;
pb.Dock = DockStyle.Fill;
progressForm.ClientSize = new Size(200, 50);
progressForm.FormBorderStyle = FormBorderStyle.FixedDialog;
progressForm.StartPosition = FormStartPosition.CenterScreen;
progressForm.Controls.Add(pb);
progressForm.ControlBox = false;
progressForm.TopMost = true;
progressForm.Show();
//do data processes here (all queries and executes)
progressForm.close();
Run Code Online (Sandbox Code Playgroud)
如何修改上面的代码以实现我的既定目标?
编辑:顺便说一句,我想在我的项目中的每个数据函数中使用此进度条表单.例如:fillGrid,runQuery ..
@Will非常感谢你的回答.我的意思是我如何使用类的函数,例如我的gridFill函数在该连接类中:
class ConnectionClass
{
public static SqlConnection connection = new SqlConnection();
public string sorgu;
public static string server;
public static string userId;
public static string catalog;
public static string password;
public static …Run Code Online (Sandbox Code Playgroud) 我在这个有用的帖子中使用了一段简单的代码
它使用一个按钮和一个标签,标签应报告"10%完成"......"20%完成"......等等.
当我调试时,代码被点击,但我的标签没有在浏览器上更新.
我尝试使用和不使用更新面板,有和没有母版页.
protected void btnStartThread_Click(object sender, EventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
// this allows our worker to report progress during work
bw.WorkerReportsProgress = true;
// what to do in the background thread
bw.DoWork += new DoWorkEventHandler(delegate(object o, DoWorkEventArgs args)
{
BackgroundWorker b = o as BackgroundWorker;
// do some simple processing for 10 seconds
for (int i = 1; i <= 10; i++)
{
// report the progress in percent
b.ReportProgress(i * 10); …Run Code Online (Sandbox Code Playgroud) 我目前有以下内容:
查看模型
MovieProcessor movieProcessor = new MovieProcessor(SelectedPath, this);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += movieProcessor.processMovie_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
progressBar.Show();
worker.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)
worker_ProgressChanged
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
CurrentProgress = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)
在我的MovieProcessor班上,我有方法processMovie_DoWork.
public async void processMovie_DoWork(object sender, DoWorkEventArgs e)
{
for (int x = 0; x < totalFilesToProcess; ++x)
{
// Do stuff like calling API
(sender as BackgroundWorker).ReportProgress(x);
}
}
Run Code Online (Sandbox Code Playgroud)
在第二次 ReportProgress(x)被调用时,我得到的错误:
This operation has already had OperationCompleted called …
backgroundworker ×10
c# ×8
.net ×2
progress-bar ×2
winforms ×2
wpf ×2
asp.net ×1
c++-cli ×1
clr ×1
mvvm ×1
parameters ×1
sql ×1
streamwriter ×1
unit-testing ×1