代码之家  ›  专栏  ›  技术社区  ›  rosi97

这种用法是任务。运行()坏习惯?

  •  1
  • rosi97  · 技术社区  · 4 年前

    如果使用 Task.Run 在这种情况下是正当的吗?
    目前我在WinForms应用程序中运行此代码,但稍后将在ASP.NET项目作为 HostedService / BackgroundService . 我不确定这是否可比。

    在阅读了多篇关于async/await和 Tasks 我觉得 Task.Run(() => .. 应该在调用方法中实现 Manager.SyncLoop() . 但是如果 IConnection 真的是异步的,这不是代码味道吗?

    private async void button1_Click(object sender, EventArgs e)
        {
            // this should be handled by the BackgroudService, WinForms is used just for testing
            var m = new Manager();
            m.Connection = new ConnectionA();
            m.ExecuteAsync();
        }
    }
    public interface IConnection
    {
        Task<object> ReadAsync();
    }
    
    // assume that i cannot change this 
    public class SomeLib
    {
        private Random random = new Random();
        public object SyncReading()
        {
            Thread.Sleep(5000);
            return random.Next(); ;
        }
    }
    
    public class ConnectionA : IConnection
    {
        private SomeLib lib = new SomeLib();
        public Task<object> ReadAsync()
        {
            // is this usage of Task.Run ok?
            var v = Task.Run(() => lib.SyncReading());
            return v;
        }
    
        // this will block UI
        //public Task<object> ReadAsync()
        //{
        //    return Task.FromResult(lib.SyncReading());
        //}
    }
    
    public class Manager 
    {
        public IConnection Connection { get; set; }
        public async Task ExecuteAsync()
        {          
            await SyncLoop();
        }
    
        public async Task SyncLoop()
        {
            while (true)
            {
                var i = await Connection.ReadAsync();
    
                await Task.Delay(2000);
            }
        }
    }
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   Stephen Cleary    4 年前

    首先,你能换衣服吗 IConnection ? 这个同步实现是主要的,还是只是众多实现中的一个?

    如果你能改变 I连接 ,然后使其同步,您就可以 use Task.Run in the implementation of ExecuteAsync

    如果 I连接 需要保持异步,那么我要说的是实现 ConnectionA.ReadAsync 同步进行。那就有 任务。运行 在里面 执行同步 和平常一样。这种技术背后的关键是异步( Task -签名意味着实现 可以 必须