【发布时间】:2021-01-31 06:52:09
【问题描述】:
我正在关注 thread 以使我的一些命令异步,而其他命令同步,但我遇到了一些问题。
这是我目前所拥有的。
一个接口:
public interface ICommand
{
public Task ExecuteAsync();
}
我在一个应该是同步的等待命令中实现的。
public class WaitCommand : ICommand
{
public Task ExecuteAsync()
{
Console.WriteLine("Sleeping...");
Thread.Sleep(5000);
Console.WriteLine("Waking up...");
return Task.CompletedTask;
}
}
还有另一个可以工作的命令,应该是异步的。
public class ConcreteCommand : ICommand
{
public async Task ExecuteAsync()
{
await Task.Run(() =>
{
Console.WriteLine("Starting...");
Thread.Sleep(1000);
Console.WriteLine("Ending...");
});
}
}
然后我有某种方法可以读取字符串并将其转换为命令:
public async Task ExecuteAsync(string commandName)
{
... get command
await command.ExecuteAsync();
}
最后我有一个循环
List<string> commands = new List<string>
{
"concreteCommand",
"wait",
"concreteCommand"
};
foreach (String command in commands)
{
await commandDispatcher.ExecuteAsync(command);
}
这是打印出来的。
Starting...
Ending...
Sleeping...
Waking up...
Starting...
Ending...
这意味着它不是异步运行的。我的实现有什么问题?
【问题讨论】:
-
你期待什么输出?
-
开始...睡觉..结束...醒来...开始...结束...基本上它应该继续启动新命令直到等待。唤醒后,它应该继续添加remaning命令。正在执行的命令应该继续执行。
-
为什么要使用Task.Run?你可以等待一个Task.Delay(1000)。无需运行另一个任务并阻止它。
-
ConcreteCommand 中的休眠是对长时间任务的模拟。我还有什么其他选择(假设在正常情况下我不想睡觉但做一些有用的事情)
标签: c#