这种 Task.Run() 的用法是不好的做法吗?

Is this usage of Task.Run() bad practice?

如果在这种情况下使用Task.Run是否合理?
目前我在 WinForms 应用程序中 运行 这段代码,但稍后它将作为 HostedService/BackgroundService 在 ASP.NET 项目中使用。我不确定这是否具有可比性。

阅读了多篇关于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);
        }
    }
}

首先,你可以改变IConnection吗?这个同步实现是主要的,还是只是众多同步实现中的一个?

如果你能改变IConnection,那就让它同步,你就可以use Task.Run in the implementation of ExecuteAsync

如果IConnection需要保持异步,那么我会说同步实现ConnectionA.ReadAsync。然后像往常一样在 ExecuteAsync 中使用 Task.Run。该技术背后的关键是异步(Task-返回)签名意味着实现可能是异步的,而不是必须 是异步的。