Tag: 后台工作者

不断监控流程

我编写了一些监视正在运行的Windows进程的代码。 我想知道某个过程何时开始以及何时结束。 代码就像我想要的那样工作。 现在,我希望在Windows窗体服务器应用程序中实现它 – 所以只要表单处于活动状态,它就会在循环中运行。 我想我应该让它可以使用BackgroundWorker异步运行。 我只是不确定最好的方法是什么以及如何做到这一点。 这是我的监视器代码: using System; using System.Management; using System.Diagnostics; using System.Collections.Generic; using System.ComponentModel; class ProcessMonitor { public static void Main() { Dictionary newProcs= new Dictionary (); while (true) { foreach (Process process in Process.GetProcesses()) { if (process.ProcessName.CompareTo(“Someprocess”) == 0) { if (!searchForProcess(newProcs, process.Id)) { ManagementObjectSearcher searcher = new ManagementObjectSearcher(“SELECT […]

在后台工作线程中使用C#全局变量是否安全

嗨,我正在研究一个简单的桌面应用程序,它需要处理一些操作,如加载可能阻塞主线程的网页,所以我将代码移动到后台工作者。 我的问题是有一个名为UCSProject的重类,它包含许多字符串和List字段,我需要将这个类的实例传递给后台worker,因为类有点重,我想减少重复的次数实例直接使用全局变量,而不是将其作为参数传递给后台工作者。 为了简短起见,我只想知道从C#中的后台工作线程访问全局变量是否安全

将Ping应用程序转换为multithreading版本以提高速度 – C#

我有一个应用程序,它会ping本地子网上的每个可能的IP,以便编译响应的IP地址列表。 目前,它一次ping所有255个。 是否可以将此应用程序转换为使用多个线程来通过一次ping多个来提高速度? 我是multithreading概念的新手,并认为这是一个很好的学习方法(只要当然可能)。 此外,您可以教育我的任何风格改进也会有所帮助。 提前谢谢 这是backgroundWorker1_DoWork事件中的当前ping方法。 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { count = 0; for (int i = 1; i < 255; i++) { Ping ping = new Ping(); PingReply pingreply = ping.Send(IPAddress.Parse(locip[0] + "." + locip[1] + "." + locip[2] + "." + i)); count += 1; if (pingreply.Status == IPStatus.Success) […]

使用BackgroundWorker更新UI而不冻结……?

我有以下代码用于从后台线程填充ListView(DoWork调用PopulateThread方法): delegate void PopulateThreadCallBack(DoWorkEventArgs e); private void PopulateThread(DoWorkEventArgs e) { if (this.InvokeRequired) { PopulateThreadCallBack d = new PopulateThreadCallBack(this.PopulateThread); this.Invoke(d, new object[] { e }); } else { // Ensure there is some data if (this.DataCollection == null) { return; } this.Hide(); // Filter the collection based on the filters List resultCollection = this.ApplyFilter(); // Get […]

如何使用Ping.SendAsync与datagridview一起使用?

我有一个应用程序ping datagridview中的每个IP,以编译响应的IP RoundtripTime列表。完成该步骤后,我将RoundtripTime推回到datagridview。 … foreach (DataGridViewRow row in this.gvServersList.Rows) { this.current_row = row; string ip = row.Cells[“ipaddr_hide”].Value.ToString(); ping = new Ping(); ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); ping.SendAsync(ip, 1000); System.Threading.Thread.Sleep(5); } … private static void ping_PingCompleted(object sender, PingCompletedEventArgs e) { var reply = e.Reply; DataGridViewRow row = this.current_row; //notice here DataGridViewCell speed_cell = row.Cells[“speed”]; speed_cell.Value = reply.RoundtripTime; […]

定期运行的Windows服务

我正在编写一个Windows服务,一旦启动就会每X小时运行一次。 它完成的过程相当密集,所以我想使用后台工作程序。 我正在使用设置文件来存储运行和上次运行服务之间的小时数。 我不确定最好的方法 – 也就是说,我希望服务尽可能少地使用资源,当它运行时,它需要在后台工作程序中运行,报告它做了什么,然后回到空闲模式。 我考虑过使用2名背景工作者。 第一个worker将是服务的私有局部变量,运行如下: while (true) { //create new background worker and run Thread.Sleep(Settings.Default.SleepTimeHours * 3600000); } 使用在循环的每次迭代中创建的子工作程序,并在完成时销毁。 为了支持取消,我想我必须在服务中有第二个工作者的本地实例,但如果当前进程没有运行它将为null。 当辅助工作程序完成时,它将发送我的报告,在设置文件中设置最后一次运行时间,然后处理该工作程序并将引用设置为null。 我想知道是否有更好的方法来做这个或最好的做法。 谢谢

BackgroundWorker.CancellationPending是如何线程安全的?

取消BackgroundWorker操作的方法是调用BackgroundWorker.CancelAsync() : // RUNNING IN UI THREAD private void cancelButton_Click(object sender, EventArgs e) { backgroundWorker.CancelAsync(); } 在BackgroundWorker.DoWork事件处理程序中,我们检查BackgroundWorker.CancellationPending : // RUNNING IN WORKER THREAD void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { while (!backgroundWorker.CancellationPending) { DoSomething(); } } 上述想法遍布整个网络,包括在BackgroundWorker的MSDN页面上 。 现在,我的问题是:这个线程安全怎么样? 我查看了ILSpy中的BackgroundWorker类 – CancelAsync()只是将cancellationPending设置为true而不使用内存屏障,而CancellationPending只返回cancellationPending而不使用内存屏障。 根据这个Jon Skeet页面 ,上面的内容不是线程安全的。 但是BackgroundWorker.CancellationPending的文档说:“这个属性是供工作线程使用的,它应该定期检查CancellationPending并在设置为true时中止后台操作。” 这里发生了什么? 它是否是线程安全的?

背景工作者永远不会停止忙碌

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(); } } 它运行五次(每个BG工作一次)并且卡住了一会儿。 背景工作者不要再忙吗? 我该如何查询空房情况? 注意:有5个工作线程,这可以确保它们都不会停止,总是为它们分配工作。 […]