我正在运行一些时间和CPU密集型的进程(TimeExpensive类型),一个接一个地进行。主线程(A)在另一个线程(B)中异步启动TimeExpensive进程,并变为不活动状态。完成后,线程B会同步触发调用者的完成处理程序,并在线程B中启动下一个TimeExpensive进程。创建了一个新线程(C),但在启动C之后,B就结束了。因此,对于n个进程,创建n个线程,大多数时间它们不会共存。
有人可能希望以线性单线程方式实现它,但是TimeExpensive是由第三方实现的,当它运行时,它使用所有系统核心并运行数小时。
上面的实现模仿了我所描述的行为。让我感到困扰的是事件处理程序在下一个线程开始之前同步运行,在此期间,它正在执行许多其设计不适合的任务。不确定这是否好用,我是否能够在Thread B的完成处理程序中返回Thread A,或者我应该使用另一个delegate.BeginInvoke来开始事件处理程序的执行?我希望用简单而安全的方法做到这一点。非常感谢您的帮助。
附言:我阅读了很多文章,但没有人处理这种情况。编辑:添加静态主要函数以显示如何在控制台应用程序中启动此代码。请记住,人们也可以创建UI来启动“Main”作业。它肯定会创建BackgroundWorker线程来创建mainJob对象并运行它。谢谢!
有人可能希望以线性单线程方式实现它,但是TimeExpensive是由第三方实现的,当它运行时,它使用所有系统核心并运行数小时。
//This will run as console app
class Program
{
static void Main(string[] args)
{
new Program().StartJobs();
}
void StartJobs()
{
Main mainJob = new Main();
mainJob.MainCompletionEvent +=
new Action<object, EventArgs>(mainJob_MainCompletionEvent);
mainJob.Start();
}
void mainJob_MainCompletionEvent(object sender, EventArgs e)
{
//if(success) Environment.Exit(0);
}
}
class Main
{
int processCounter = 0;
public event Action<object, EventArgs> MainCompletionEvent;
public void Start()
{
//...do other important tasks here...
processCounter++;
TimeExpensive te = new TimeExpensive();
te.CompletionEvent += new Action(TimeExpensive_CompletionHandler);
Thread aThread = new Thread(te.Run);
aThread.IsBackground = false;
aThread.Name = "TimeExpensive Thread: " + processCounter;
aThread.Start();
}
void TimeExpensive_CompletionHandler()
{
Console.WriteLine("current Thread Name: " + Thread.CurrentThread.Name);
//Start another Process In Background if
if (processCounter < 5)
{
Start();
}
else
{
Console.ReadKey();
if (JobCompletionEvent != null)
JobCompletionEvent(this, new EventArgs());
}
}
}
class TimeExpensive
{
public event Action CompletionEvent;
public void Run()
{
//doing time expensive task
//...
//when finish Notify completion Handler...
if (CompletionEvent != null)
{
CompletionEvent();
}
}
}
//Output
current Thread Name: TimeExpensive Thread: 1
current Thread Name: TimeExpensive Thread: 2
current Thread Name: TimeExpensive Thread: 3
current Thread Name: TimeExpensive Thread: 4
current Thread Name: TimeExpensive Thread: 5
上面的实现模仿了我所描述的行为。让我感到困扰的是事件处理程序在下一个线程开始之前同步运行,在此期间,它正在执行许多其设计不适合的任务。不确定这是否好用,我是否能够在Thread B的完成处理程序中返回Thread A,或者我应该使用另一个delegate.BeginInvoke来开始事件处理程序的执行?我希望用简单而安全的方法做到这一点。非常感谢您的帮助。
附言:我阅读了很多文章,但没有人处理这种情况。编辑:添加静态主要函数以显示如何在控制台应用程序中启动此代码。请记住,人们也可以创建UI来启动“Main”作业。它肯定会创建BackgroundWorker线程来创建mainJob对象并运行它。谢谢!