C# 持续运行后台工作人员
我需要能够持续运行我的C# 持续运行后台工作人员,c#,multithreading,winforms,backgroundworker,infinite-loop,C#,Multithreading,Winforms,Backgroundworker,Infinite Loop,我需要能够持续运行我的BackgroundWorker。DoWork事件包含一个池线程化进程,OnComplete更新我的UI 我无法找到一种方法来无限循环BackgroundWorker.RunWorkerAsync()方法,而不冻结整个程序。任何帮助都将不胜感激。您必须在您的工作方法中进行循环。要更新UI,应使用ProgressChanged方法。下面是一个小示例,它是如何显示的 public Test() { this.InitializeComponent();
BackgroundWorker
。DoWork
事件包含一个池线程化进程,OnComplete
更新我的UI
我无法找到一种方法来无限循环
BackgroundWorker.RunWorkerAsync()
方法,而不冻结整个程序。任何帮助都将不胜感激。您必须在您的工作方法中进行循环。要更新UI,应使用ProgressChanged方法。下面是一个小示例,它是如何显示的
public Test()
{
this.InitializeComponent();
BackgroundWorker backgroundWorker = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
backgroundWorker.DoWork += BackgroundWorkerOnDoWork;
backgroundWorker.ProgressChanged += BackgroundWorkerOnProgressChanged;
}
private void BackgroundWorkerOnProgressChanged(object sender, ProgressChangedEventArgs e)
{
object userObject = e.UserState;
int percentage = e.ProgressPercentage;
}
private void BackgroundWorkerOnDoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker) sender;
while (!worker.CancellationPending)
{
//Do your stuff here
worker.ReportProgress(0, "AN OBJECT TO PASS TO THE UI-THREAD");
}
}
如果您的程序冻结,可能是因为您的无限循环后台工作线程正在旋转,使用100%的CPU。您还没有说明为什么需要它在无限循环中运行,但是您可以先在该循环中放置一个
线程。Sleep
。我以前在需要在后台运行某些东西时就这样做了。
如果您试图在backgroundworker运行时运行它,您将获得一次开除!
这就是为什么我让BackGroundWorker在完成事件时自动启动
然后它将永远循环
private void Main_Load(object sender, EventArgs e)
{
// Start Background Worker on load
bgWorker.RunWorkerAsync();
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(1000); // If you need to make a pause between runs
// Do work here
}
private void bgCheck_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Update UI
// Run again
bgWorker.RunWorkerAsync(); // This will make the BgWorker run again, and never runs before it is completed.
}
您想对您的
后台工作人员做什么?为什么您希望它连续运行?为什么不使用“常规”线程呢?或者是任务之类的。。你到底为什么需要后台工作人员?好吧,它从来就不是要这样使用的。你可以与主线程(UI)通信,并让BackgroundWorker使用ReportsProgress运行。后台工作程序运行一个类,该类运行一个多线程进程,每个线程ping一个服务器。我希望在应用程序运行期间,流程始终处于运行状态,并向UI提供数据。需要时,您只需向BGWorker/ThreadPool添加项即可。这里不应该有一个完整的“持续”运行的场景。使用((BackgroundWorker)sender)代替(true)
。取消挂起
,并且您支持取消。不过,需要在这一点上翻转逻辑。CancellationPending最初为false,当用户想要取消它时变为true。所以循环应该检查!worker.CancellationPending
Thread.Sleep是一种不好的做法,不应该用于生产。问题似乎是其他while循环正在进行,例如while(true)。当一个长时间运行的任务要运行并完成时,应该使用线程。即使任务已完成,也没有理由保持线程运行。你需要让事情像他们说的那样“自然发生”。@Ahmedilyas-我没有建议把任何东西投入生产。我认为运行无限循环的BackgroundWorker是一种值得怀疑的做法,但加入线程。睡眠可能会使OP超越“应用程序冻结”问题,从而能够更多地考虑他的设计。他没有说他为什么想要一个无限循环,所以很难提出更合适的替代方案。请注意,“无限循环”并不意味着在多线程应用程序中100%的CPU使用率——通常,它们会阻塞某些东西。而且,这种使用Thread.Sleep的做法确实是不好的,但它有着合法的用途。@MartinJames-似乎对此投了反对票。当然,我同意你的观点,无限循环并不意味着100%的CPU,但是如果有人说如果没有整个程序冻结,他们就不能让无限循环工作,那么插入睡眠可能会帮助他们理解为什么。希望,一旦他们理解了原因,他们将能够设计出一个不需要睡眠的更好的解决方案。与其在每次结束后都重新开始,为什么不做一个while(true)循环,让它无限地运行呢?工作完美无瑕!它的实现比计时器更简单,并且在不锁定UI的情况下完成它的工作!非常感谢,很棒的方法:)!应标记为答案。-bkribs,因为这样,如果需要更新UI元素,您还可以在“ProgressUpdate”和“WorkerCompleted”中添加代码:)最好包含某种形式的详细信息或说明,说明您的答案为什么有效,而不仅仅是代码。虽然此代码片段可以解决问题,确实有助于提高你的文章质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!
timer.interval=60000 // 1 min
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
try
{
//Do something
}
catch
{
}
}