这种 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
-返回)签名意味着实现可能是异步的,而不是必须 是异步的。
如果在这种情况下使用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
-返回)签名意味着实现可能是异步的,而不是必须 是异步的。