Tag: 后台

请帮助我使这段代码线程安全

我在使数据加载和过滤线程安全方面遇到了一些问题。 我的控件基类上的以下代码通过BackgroundWorker处理所有数据填充。 这往往会在“this.DataWorker.RunWorkerAsync()”上抛出错误,说明BackgroundWorker正忙。 /// /// Handles the population of the form data. /// /// Whether to pull data back from the WebService. public void Populate(bool reload) { if (!this.DataWorker.IsBusy) { // Disable the filter options IvdSession.Instance.FilterManager.SetEnabledState(this.GetType(), false); // Perform the population this.DataWorker.RunWorkerAsync(reload); } else if (!reload) { // If the data worker is busy and […]

在检查取消时发送背景工作人员睡觉

我有一个后台工作者,通过ReportProgress定期更新GUI。 更新定期发生,例如每5秒一次,或者可能是20秒。 为了在设定的时间执行更新,我将工作进程发送到hibernate状态一段时间,当它唤醒时,它会使用新信息更新GUI。 工作人员支持取消,在睡觉之外取消正确。 我希望能够在等待期间调用取消,但是将线程发送到睡眠状态会使这变得不可能。 我假设我将不得不调用一个循环并检查取消作为循环的一部分来模拟线程睡眠。 实现这一目标的最佳方法是什么,我的尝试完全取消了。 long counter = 0; long sleepfor = timelinespeed*1000; int timelinespeed = 10; while (counter != sleepfor) { Thread.Sleep(1); counter++; if (bkgwk.CancellationPending) { cancelled = true; e.Cancel = true; bkgwk.Dispose(); break; } }

后台工作者在自己的class级处理

好吧,我有以下问题,希望你能帮助我: 我想创建一个带后台工作程序的WPF应用程序,用于更新richtextboxes和其他UI元素。 这个后台工作者应该处理一些数据,例如处理文件夹的内容,做一些解析等等。 因为我想在Main类之外移动尽可能多的代码,所以我创建了一个名为MyProcess.cs类,如下所示(事实上,到目前为止,这个类没有多大意义,它将填充更多处理元素,如果这个问题已经解决)。 一般function应该是: MainWindow:将创建一个字符串数组(名为this.folderContent ) MainWindow:后台工作者开始将此数组作为参数 MainWindow:将调用DoWork()方法(我知道,这个方法现在在一个新线程中运行) MyProcess:根据给定的字符串数组生成一个(迄今为止未格式化的)段落 MainWindow:如果后台工作程序完成,则调用RunWorkerCompleted()方法(在UI线程中运行),该方法应通过方法的返回参数更新WPF RichTextBox 最后一步导致带有注释的InvalidOperationsException,“调用线程无法访问此对象,因为另一个线程拥有它”。 我读了一下后台工作者类及其function。 所以我认为它与this.formatedFilenames.Inlines.Add(new Run(…))的Execute()方法中的this.formatedFilenames.Inlines.Add(new Run(…))调用MyProcess 。 如果我用字符串列表或类似的东西替换Paragraph属性(没有额外的new()调用)我可以通过get方法访问此成员而不会出现任何问题。 与我发现的后台工作者相关的所有示例都只返回基本类型或简单类。 MainWindow.xaml.cs public MainWindow() { InitializeComponent(); this.process = new MyProcess(); this.worker = new BackgroundWorker(); this.worker.DoWork += worker_DoWork; this.worker.RunWorkerCompleted += worker_RunWorkerCompleted; } private void worker_DoWork(object sender, DoWorkEventArgs e) { this.process.Execute((string[])e.Argument); e.Result = this.process.Paragraph(); } private void worker_RunWorkerCompleted(object […]

使用WPF中的Backgroundworker为主应用程序弹出MessageBox

在WPF应用程序中,我使用BackgroundWorker定期检查服务器上的条件。 虽然工作正常,但我希望弹出一个MessageBox,如果在检查过程中出现故障,请通知用户。 这就是我所拥有的: public static void StartWorker() { worker = new BackgroundWorker(); worker.DoWork += DoSomeWork; worker.RunWorkerAsync(); } private static void DoSomeWork(object sender, DoWorkEventArgs e) { while (!worker.CancellationPending) { Thread.Sleep(5000); var isOkay = CheckCondition(); if(!isOkay) MessageBox.Show(“I should block the main window”); } } 但是这个MessageBox不会阻止主窗口。 我仍然可以点击我的WPF应用程序并使用MessageBox更改我喜欢的任何内容。 我该如何解决这个问题? 谢谢, 编辑: 作为参考,这是我最终做的事情: public static void StartWorker() { worker = […]

如何等待BackgroundWorker完成然后退出控制台应用程序

我已经编写了一个示例控制台应用程序来使用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 […]

.NET Web服务和BackgroundWorker线程

我正试图在webservice方法中做一些异步的东西。 假设我有以下API调用: http : //www.example.com/api.asmx 并且该方法称为GetProducts() 。 我这个GetProducts方法,我做了一些事情(例如从数据库中获取数据)然后在我返回结果之前,我想做一些异步的东西(例如给我发电子邮件)。 所以这就是我所做的。 [WebMethod(Description = “Bal blah blah.”)] public IList GetProducts() { // Blah blah blah .. // Get data from DB .. hi DB! // var myData = ……. // Moar clbuttic blahs 🙂 (yes, google for clbuttic if you don’t know what that is) // Ok .. […]

简单的BackgroundWorker不会更新网页上的标签

我在这个有用的post中使用了一段简单的代码 它使用一个按钮和一个标签,标签应报告“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 […]

使用队列创建BackgroundWorker

我需要创建队列并将其与BackgroundWorker一起使用。 所以我可以添加操作,然后在下一步完成时将在后台启动。 我通过谷歌找到了这个代码: public class QueuedBackgroundWorker { public void QueueWorkItem( Queue queue, T inputArgument, Func doWork, Action workerCompleted) { if (queue == null) throw new ArgumentNullException(“queue”); BackgroundWorker bw = new BackgroundWorker(); bw.WorkerReportsProgress = false; bw.WorkerSupportsCancellation = false; bw.DoWork += (sender, args) => { if (doWork != null) { args.Result = doWork(new DoWorkArgument((T)args.Argument)); } }; bw.RunWorkerCompleted […]

在BackGroundWorker中运行方法并显示ProgressBar

我想要的是当一些方法正在做一些任务时UI保持活跃,我想在进度条中显示工作的进度。 我有一个方法,一个BackGroundWorker和一个Progressbar 。 我想在BackGroundWorker开始运行时调用该方法并显示进度。 该方法包含一个循环。 因此,它可以报告进度。 那么,可以做些什么呢? private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the ‘dataSet1.TBLMARKET’ table. You can move, or remove it, as needed. myBGWorker.WorkerReportsProgress = true; } private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) { parseFiles(); } private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { myProgressBar.Value […]

您是否可以链接到使用BackgroundWorker的好示例,而无需将其作为组件放在表单上?

我记得很多年前(2005年)我在我的代码中使用BackgroundWorker而没有使用可视化组件,但是我不记得是什么(不幸的是我很忘记并且在我停止使用它之后很快忘记了所有内容) 。 也许我正在扩展BackgroundWorker类。 你能链接到这种方式使用BackgroundWorker的好例子吗?