我很难理解async
及其相应的行为。以下是我正在尝试编写的程序模型和问题再现:
namespace AsyncTesting
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("starting....");
MyClass myClass = new MyClass();
myClass.DoSomeWork();
Console.WriteLine("ending....");
Console.ReadLine();
}
}
class MyClass
{
public bool DoSomeWork()
{
return GetTrue().Result;
}
Task<bool> GetTrue()
{
return new Task<bool>(() => true);
}
}
}
当我调用 GetTrue().Result
时,它永远不会返回。我的 Task<bool> GetTrue()
方法是一个用于重现目的的虚拟方法,但我不确定为什么它从未返回。但如果我加上这个:
namespace AsyncTesting
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("starting....");
MyClass myClass = new MyClass();
myClass.DoSomeWork();
Console.WriteLine("ending....");
Console.ReadLine();
}
}
class MyClass
{
public async void DoSomeWork()
{
await GetTrue();
}
Task<bool> GetTrue()
{
return new Task<bool>(() => true);
}
}
}
问题是,我希望在我的重现中保留初始行为。我不想使用
async void
来调用方法。我想要从我的“正常”方法中返回 bool
。如何实现这一点? 如何让第一个示例运行并实际从 DoSomeWork()
返回 bool
?提前致谢。
编辑:感谢回答。 我想问题是,我的
GetTrue()
方法不是真正的重现。在我的方法中,我没有生成实际的 Task<bool>
对象。它实际上是对 Task.Factory.FromAsync<bool>()
的调用,该方法创建了 Task<bool>
对象。而正是这个任务我不知道如何“启动”。还有其他建议吗? 谢谢!
task.Result
阻塞FromAsync
的结果,你需要澄清这段代码的实际上下文。它是一个简单的控制台应用程序,还是一个 WinForms / WPF / ASP.NET 应用程序?这可能会解释为什么你遇到了死锁。请查看 Stephen Cleary 的博客:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html - noseratio - open to workTask.Factory.FromAsync<bool>()
调用将包装服务推送给消费者的Begin...()
和End...()
函数。但我看不到任何启动任务的方法,它只是挂起了。 - user3175663