我对使用async修饰符进行异步编程并不熟悉。我试图弄清楚如何确保我的控制台应用程序的主要方法实际上是异步运行的。
class Program
{
static void Main(string[] args)
{
Bootstrapper bs = new Bootstrapper();
var list = bs.GetList();
}
}
public class Bootstrapper {
public async Task<List<TvChannel>> GetList()
{
GetPrograms pro = new GetPrograms();
return await pro.DownloadTvChannels();
}
}
我知道这不是从“顶层”异步运行的。由于不可能在Main方法上指定异步修饰符,我如何在Main中异步运行代码?
如果你使用的是c# 7.1或更高版本,使用nawfal的答案,只需将Main方法的返回类型更改为Task或Task<int>。如果你不是:
有一个像Johan说的异步任务MainAsync。
调用它的. getawaiter (). getresult()来捕获像do0g所说的底层异常。
像科里说的那样取消支持。
第二个CTRL+C应该立即终止该进程。(谢谢binki !)
处理OperationCancelledException -返回适当的错误码。
最终代码如下:
private static int Main(string[] args)
{
var cts = new CancellationTokenSource();
Console.CancelKeyPress += (s, e) =>
{
e.Cancel = !cts.IsCancellationRequested;
cts.Cancel();
};
try
{
return MainAsync(args, cts.Token).GetAwaiter().GetResult();
}
catch (OperationCanceledException)
{
return 1223; // Cancelled.
}
}
private static async Task<int> MainAsync(string[] args, CancellationToken cancellationToken)
{
// Your code...
return await Task.FromResult(0); // Success.
}
c# 7.1(使用vs 2017更新3)引入了async main
你可以这样写:
static async Task Main(string[] args)
{
await ...
}
有关c# 7系列的更多详细信息,第2部分:异步主
更新:
你可能会得到一个编译错误:
程序不包含适用于入口点的静态'Main'方法
此错误是由于vs2017.3默认配置为c#7.0而不是c#7.1。
您应该显式地修改项目的设置来设置c#7.1特性。
你可以通过以下两种方法设置c#7.1:
方法一:使用项目设置窗口:
打开项目的设置
选择Build选项卡
点击高级按钮
选择所需的版本
如下图所示:
方法2:手动修改.csproj的PropertyGroup
添加这个属性:
<LangVersion>7.1</LangVersion>
例子:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<LangVersion>7.1</LangVersion>
</PropertyGroup>