amm*_*com 3 c# asynchronous windows-services async-await
我正在开发一个能够接收套接字连接的Windows服务,因此在OnStart方法中:
protected override void OnStart(string[] args)
{
start();
}
Run Code Online (Sandbox Code Playgroud)
该start函数如下所示:
public async void Start()
{
//initialization things
...
...
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
while(true)
{
TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(false);
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是不接受任何连接,而相同的代码在标准命令行项目中运行完美,我怀疑我的设计存在问题,哪个线程运行该方法?当控制权在接受过程后OnStart返回时,是异步方法被忽略,因为它是 Windows 服务中的特殊情况?欢迎任何建议OnStartawait
当调用 start() 方法时,代码会立即继续并完成 OnStart。现在您自己的代码中没有任何部分能够捕获任何异常。异常必须由任务调度程序捕获。但这仅在等待任务或垃圾收集时才会发生。
所以基本上,您的代码可能会抛出一个在被垃圾收集Exception之前一直未被观察到的异常Task。为了更快地捕获日志异常,请始终确保捕获方法内未在任何地方等待的异常:
protected override void OnStart(string[] args)
{
Start();
// This method finishes immediately (or at least after your first
// 'await' in the Start() method. That does not mean Start() runs
// on another thread however.
}
private async Task Start()
{
try
{
//initialization things
...
...
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
while(true)
{
TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(false);
...
}
...
}
catch (Exception ex)
{
// TODO: LOG! And probably stop the service too.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11077 次 |
| 最近记录: |