C# 异步方法调用
本文关键字:调用 异步方法 | 更新日期: 2023-09-27 18:31:36
我会对函数进行异步调用,如下所示:
我将从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");
}
我会先输出"测试",然后再"离开",我该如何练习?
最简单的选择是在异步方法中引入延迟:
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
}
你可以这样做
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");
});
}
您可以使用 Task 来实现此目的。在这种情况下,您无需将函数标记为异步:
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");
}