有使用线程的好方法吗?

时间:2019-07-03 11:43:04

标签: c# multithreading

我正在一个项目上,我必须创建一个线程来执行后台任务。 我不想每秒钟刷新一次计数,它应该随时间变化。 因此,我在motherClass.cs中的构造函数中创建了这样的线程:

Thread t = null;
        if (StaticContext.MyThread == null)
            StaticContext.MyThread = new Thread(new 
ThreadStart(ThreadProc));

        t = StaticContext.MyThread;

这是我的类StaticContext.cs中MyThread属性的定义:

public static Thread MyThread { get; set; }

此代码有效,在开始时我的线程仅创建一次。

现在,这是我的线程开始的定义:ThreadProc,它位于我的motherClass.cs中:

public async void SetNbVoyage()
    {
        List<LogiStock.DTO.Voyage> voyages = await 
this._serviceVoyage.GetVoyageDispo();
        if (_rdm == null)
        {
            Voyage = voyages.Count.ToString();
        }
        else
            Voyage = _rdm.Next().ToString(); 
    }
    Random _rdm = null;
    public void ThreadProc()
    {
        _rdm = new Random(100);
        Task task = new Task(() =>
        {
            while (true)
            {

                SetNbVoyage();
                Thread.Sleep(1000);
            }
        });
        task.Start();
    }

我在声明线程之前初始化了我的Property“ Voyage”。 问题:我的线程似乎无法正常工作,实际上,该值永远不变,而且我也不知道如何查看我的线程是否真正在工作。

1 个答案:

答案 0 :(得分:0)

您应该使用Microsoft的Reactive Framework(又名Rx)-NuGet System.Reactive并添加using System.Reactive.Linq;-然后您可以执行以下操作:

Random _rdm = null;
IDisposable _subscription = null;

public void ThreadProc()
{
    _rdm = new Random(100);
    _subscription =
        Observable
            .Interval(TimeSpan.FromSeconds(1.0))
            .Select(x => _rdm.Next().ToString())
            .Subscribe(x => Voyage = x);
}

要停止间隔计时器,只需执行_subscription.Dispose();。很简单。