如何创建异步/等待控制台应用程序c#时钟
我不熟悉如何创建异步/等待控制台应用程序c#时钟,c#,async-await,real-time-clock,C#,Async Await,Real Time Clock,我不熟悉async/await,我尝试创建一个响应时钟作为演示。时钟工作正常,但当我试图让它进入异步功能并等待延迟时,它停止工作,只显示它运行的时间。代码如下: 公共静态异步无效时钟() { while(true) { Console.WriteLine(DateTime.Now.ToString()); 等待任务。延迟(1000); Console.Clear(); } } 主要是: clock() 编辑: 应用程序似乎没有通过等待任务的阶段运行。延迟(1000)这让我相信有无限的延迟,可能
async/await
,我尝试创建一个响应时钟作为演示。时钟工作正常,但当我试图让它进入异步功能并等待延迟时,它停止工作,只显示它运行的时间。代码如下:
公共静态异步无效时钟()
{
while(true)
{
Console.WriteLine(DateTime.Now.ToString());
等待任务。延迟(1000);
Console.Clear();
}
}
主要是:
clock()代码>
编辑:
应用程序似乎没有通过等待任务的阶段运行。延迟(1000)
这让我相信有无限的延迟,可能是因为等待
。但据我所知,从逻辑上讲,这是不应该发生的,我也看到过一些在延迟时使用await
的例子,所以这一定是可能的。通过从Main
调用clock()
您可以使clock()
返回一个Task
并使用clock().Wait()
blockMain
方法,直到任务完成(这将永远不会完成,因为clock()
包含一个无限循环并且永远不会结束)
如果不等待任务完成,Wait()
Main将运行到完成,导致应用程序关闭
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main 1");
DoSomethingAsync().Wait();
Console.WriteLine("Main 2");
}
public static async Task DoSomethingAsync()
{
Console.WriteLine("DoSomethingAsync 1");
await Task.Delay(1000);
Console.WriteLine("DoSomethingAsync 2");
}
}
应用程序的输出:
Main 1
DoSomethingAsync 1
(delay of 1 second)
DoSomethingAsync 2
Main 2
如果没有Wait()
,它将是:
Main 1
DoSomethingAsync 1
Main 2
Main 1
Main 2
DoSomethingAsync 1
或者更可能是:
Main 1
DoSomethingAsync 1
Main 2
Main 1
Main 2
DoSomethingAsync 1
通过从Main
调用clock()
可以启动异步任务,而无需等待它完成
您可以使clock()
返回一个Task
并使用clock().Wait()
blockMain
方法,直到任务完成(这将永远不会完成,因为clock()
包含一个无限循环并且永远不会结束)
如果不等待任务完成,Wait()
Main将运行到完成,导致应用程序关闭
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main 1");
DoSomethingAsync().Wait();
Console.WriteLine("Main 2");
}
public static async Task DoSomethingAsync()
{
Console.WriteLine("DoSomethingAsync 1");
await Task.Delay(1000);
Console.WriteLine("DoSomethingAsync 2");
}
}
应用程序的输出:
Main 1
DoSomethingAsync 1
(delay of 1 second)
DoSomethingAsync 2
Main 2
如果没有Wait()
,它将是:
Main 1
DoSomethingAsync 1
Main 2
Main 1
Main 2
DoSomethingAsync 1
或者更可能是:
Main 1
DoSomethingAsync 1
Main 2
Main 1
Main 2
DoSomethingAsync 1
首先也是最重要的Task.Delay
返回一个Task
。这是必要的,因为我们可能需要让应用程序在执行逻辑之前等待
第二,如果只想使时钟方法同步,则不建议使用使其静态。因为它会阻止整个类的执行。
请参阅此以了解更多信息
现在关于实施。因为我们将时钟()作为一个同步的非静态方法。我们需要在main方法中创建类的对象,并调用clock()
我们可以使用Task.Run()
创建新线程
public Task clock()
{
while (true)
{
Console.WriteLine(DateTime.Now.ToString());
Task.Run(() => Task.Delay(1000));
Console.Clear();
}
}
首先也是最重要的Task.Delay
返回一个Task
。这是必要的,因为我们可能需要让应用程序在执行逻辑之前等待
第二,如果只想使时钟方法同步,则不建议使用使其静态。因为它会阻止整个类的执行。
请参阅此以了解更多信息
现在关于实施。因为我们将时钟()作为一个同步的非静态方法。我们需要在main方法中创建类的对象,并调用clock()
我们可以使用Task.Run()
创建新线程
public Task clock()
{
while (true)
{
Console.WriteLine(DateTime.Now.ToString());
Task.Run(() => Task.Delay(1000));
Console.Clear();
}
}
静态对异步/同步行为没有影响。它不会“阻碍整个班级”。您提到的链接是针对Java的,它的synchronized conceptStatic对异步/同步行为没有影响。它不会“阻碍整个班级”。您提到的链接是针对Java及其同步概念的