线程与异步循环

问题描述 投票:0回答:1

我正在尝试将 test1 源代码更改为 test2 源代码。 两个源代码有什么区别吗? 哪种代码效率更高

public class Test1
{
    public static Test1 Instance { get; } = new Test1();
    public event EventHandler EventSomething;

    public Test1()
    {
        Thread thread = new Thread(new ThreadStart(Run));
        thread.IsBackground = true;
        thread.Start();
    }

    void Run()
    {
        while (true)
        {
            Thread.Sleep(5 * 1000);
            EventSomething?.Invoke(this, new EventArgs());
        }
    }
}

public class Test2
{
    public static Test2 Instance { get; } = new Test2();
    public event EventHandler EventSomething;

    public Test2()
    {
        Run();
    }

    async void Run()
    {
        await Task.Delay(5 * 1000);
        EventSomething?.Invoke(this, new EventArgs());
        Run();
    }
}

我觉得没有什么区别

c# multithreading loops asynchronous
1个回答
0
投票

两者都不好。

如果您想定期执行某些操作,则在大多数情况下应该使用计时器。这使您的意图更加清晰,代码更具可读性。

使用任何计时器时,您需要考虑一些事情。这些也与您的“原型计时器”相关

  1. 使用什么线程(即 UI 线程或后台线程)?
  2. 是否要在时间间隔中包含执行工作的时间?
  3. 是否存在多次执行重叠的风险?

大多数计时器列表中缺少“异步计时器”的新定期计时器,即

while(notCanceled){
    await myPeriodicTimer.WaitForNextTick();
    EventSomething?.Invoke(this, new EventArgs());
}
© www.soinside.com 2019 - 2024. All rights reserved.