c# - 子线程如何将其状态/进度通知父线程?

标签 c#

我有一项服务负责许多任务,其中一项是在单独的线程(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/

相关文章:

c# - 正则表达式匹配 IP

c# - C# 中的构造函数

c# - 将 html 组件添加到页面的 AJAX 最佳实践

c# - .Net 扩展方法(此字符串 Foo)仅部分可见

c# - 我该如何修复“"error CS0009: Metadata file "System.Xml.dll'无法打开-图像太小”?

c# winforms datagridview checkbox - 将可点击区域增加到整个列宽

c# - 从锯齿状数组中的多维数组中删除行

c# - MODI还在维护吗?

c# - 在 Wow6432Node 和普通配置单元中创建注册表

javascript - 将特定 '.' 符号替换为 '_' 的正则表达式