c# - 每n秒更新一次对象状态

标签 c# multithreading

我有 worker 类(Class),他们的工作是启动whileloop。我有每个工作类在自己的线程上运行的列表。每 n 秒我应该能够打印每个工作人员的循环数。 我的目的是在 n 秒(例如 20 秒)后打印每个 worker 的信息
worker1 - noOfLoops - 10
worker2 - noOfLoops - 20
worker - noOfLoops - 30
我怎样才能做到这一点。 代码片段

class Program
{
    static void Main(string[] args)
    {
        List<IWorkerClass> workerClasses = new List<IWorkerClass>();
        for (int i = 0;i<5; i++)
        {
            workerClasses.Add(new WorkerClass("worker" + i.ToString()));
        }

        foreach(IWorkerClass wc in workerClasses)
            {
                IWorkerClass temp = wc;
                Thread workerThread = new Thread(() => wc.StartWhileLoop());
                workerThread.Start();
            }
            Console.ReadKey();
        }
    }
    public interface IWorkerClass
    {
        int noOfLoops { get; set; }
        void StartWhileLoop();
    }

    public class WorkerClass : IWorkerClass
    {       
        string _name = string.Empty;
        public WorkerClass(string name)
        {
            this._name = name;
        }
        public int noOfLoops{get;set;}

        public void StartWhileLoop()
        {
            while(true)
            {
                Thread.Sleep(3000);
                noOfLoops += 1;                      
            }
        }
    }
}

最佳答案

下面的代码保留现有结构并创建一个执行 ThreadReader 的新线程每 20 秒询问每个工作人员的进度。

using System;
using System.Collections.Generic;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        List<IWorkerClass> workerClasses = new List<IWorkerClass>();
        for (int i = 0; i < 5; i++)
        {
            workerClasses.Add(new WorkerClass("worker" + i.ToString()));
        }

        foreach (IWorkerClass wc in workerClasses)
        {
            IWorkerClass temp = wc;
            Thread workerThread = new Thread(() => temp.StartWhileLoop());
            workerThread.Start();
        }

        Thread checkerThread = new Thread(() => ThreadReader(workerClasses));
        checkerThread.Start();

        Console.ReadKey();
    }

    static void ThreadReader(List<IWorkerClass> workers)
    {
        while (true)
        {
            foreach (var worker in workers)
            {
                Console.WriteLine($"{worker.name} - {worker.noOfLoops}");
            }

            Thread.Sleep(20000);
        }
    }
}
public interface IWorkerClass
{
    string name { get; set; }
    int noOfLoops { get; set; }
    void StartWhileLoop();
}

public class WorkerClass : IWorkerClass
{
    public string name { get; set; }
    public WorkerClass(string name)
    {
        this.name = name;
    }
    public int noOfLoops { get; set; }

    public void StartWhileLoop()
    {
        while (true)
        {
            Thread.Sleep(3000);
            noOfLoops += 1;

        }
    }
}

关于c# - 每n秒更新一次对象状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44757418/

相关文章:

Java同步函数工作而同步块(synchronized block)不工作

c# - 是否可以限制 EventWaitHandle 的设置/重置?

c++ - 在没有互斥锁的情况下并发追加到列表尾部

ios - CoreData 阻塞 UI

c# - 按下按钮时动态添加用户控件

c# - .NET MVC 3 在 C# 中向 SelectListItem 添加属性

c# - LINQ 查询问题,序列不包含任何元素

c# - ContextMenuStrip 你如何强制更新(大小错误 b/c 我隐藏了它的一些项目)

c# - 当包含 "$"的文本时,Regex.IsMatch 不起作用

c++ - 如何有效地合并 TBB 线程的结果