我有一项服务负责许多任务,其中一项是在单独的线程(threadJob 子线程)上启 Action 业(一次一个),这些作业可能需要相当长的时间和
他们有不同的阶段,我需要向他们汇报。
调用应用程序经常从服务 (GetStatus) 请求状态,这意味着服务需要以某种方式知道作业(子线程)在什么时候
at,我希望在某些里程碑处,子线程可以以某种方式通知 (SetStatus) 父线程(服务)其状态,并且该服务可以返回该信息
到调用应用程序。
例如 - 我想做这样的事情:
class Service
{
private Thread threadJob;
private int JOB_STATUS;
public Service()
{
JOB_STATUS = "IDLE";
}
public void RunTask()
{
threadJob = new Thread(new ThreadStart(PerformWork));
threadJob.IsBackground = true;
threadJob.Start();
}
public void PerformWork()
{
SetStatus("STARTING");
// do some work //
SetStatus("PHASE I");
// do some work //
SetStatus("PHASE II");
// do some work //
SetStatus("PHASE III");
// do some work //
SetStatus("FINISHED");
}
private void SetStatus(int status)
{
JOB_STATUS = status;
}
public string GetStatus()
{
return JOB_STATUS;
}
};
因此,当需要执行作业时,将调用 RunTask() 并启动线程 (threadJob)。这将运行并执行一些步骤(使用 SetStatus 将新状态设置为
各种点),最后完成。现在,还有一个 GetStatus() 函数,它应该在请求时(从使用 IPC 的调用应用程序)返回 STATUS - 这个状态
应该反射(reflect)threadJob运行的作业的当前状态。
所以,我的问题很简单...... threadJob(或更具体地说是 PerformWork())如何以线程安全的方式将状态更改返回给服务(我假设上面的 SetStatus/GetStatus 示例是
不安全)?我需要使用事件吗?我假设我不能简单地直接更改 JOB_STATUS ...我应该使用 LOCK(如果是的话?)...
最佳答案
您可能已经调查过了,但是 BackgroundWorker类为您在后台线程上运行任务提供了一个很好的界面,并提供了 Hook 事件以获取进度已更改的通知。
关于c# - 子线程如何将其状态/进度通知父线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381420/