我会对函数进行异步调用,如下所示:
我将从main方法调用一个方法,这个函数应该是异步的,我该怎么做?
一个小例子:
private static void Main(string[] args)
{
StartDoingNothingAsync();
Console.WriteLine("test");
Console.Read();
}
private static async void StartDoingNothingAsync()
{
for (var i = 0; i < 5000; i++)
{
//do something
}
Console.WriteLine("leaved");
}
我首先输出&#34;测试&#34;,在#34; leaved&#34;之前,我该如何练习?
答案 0 :(得分:0)
最简单的选择是在您的异步方法中引入延迟:
private static async void StartDoingNothingAsync()
{
await Task.Delay(1000);
// This will be called on a thread-pool thread
Console.WriteLine("leaved");
}
test
之前不会保证 leaved
,但似乎很有可能。如果您确实需要保证,则必须将某些内容传递到StartDoingNothingAsync
,然后在打印test
之后发出信号...但是您不清楚自己是什么试图实现。
请注意,异步方法几乎永远 void
- 基本上只能用于允许异步事件处理程序。让方法返回Task
- 这样你的调用代码可以告诉它什么时候完成。 (即使你在这种情况下不使用这个事实,这是一个很好的习惯。)
既然我们有关于您要实现的内容的更多信息,我建议不使StartDoingNothingAsync
成为异步方法 - 只需使用任务:
private static void Main(string[] args)
{
Task task = Task.Run(DoSomething);
Console.WriteLine("test");
task.Wait();
Console.Read();
}
static void DoSomething()
{
// Code to run on a separate thread
}
答案 1 :(得分:0)
你可以这样做
private static void Main(string[] args)
{
StartDoingNothingAsync();
Console.WriteLine("test");
Console.Read();
}
private static async void StartDoingNothingAsync()
{
await Task.Run(async delegate()
{
for (var i = 0; i < 5000; i++)
{
//do something
}
Console.WriteLine("leaved");
});
}
答案 2 :(得分:0)
您可以使用任务。在这种情况下,您不需要将函数标记为异步:
private static void Main(string[] args)
{
new Task(StartDoingNothing).Start();
Console.WriteLine("test");
Console.Read();
}
private static void StartDoingNothing()
{
for (var i = 0; i < 5000; i++)
{
//do something
}
Console.WriteLine("leaved");
}