gpt4 book ai didi

C#,在 Windows 服务的 OnStart 中调用异步方法

转载 作者:行者123 更新时间:2023-12-04 16:29:10 25 4
gpt4 key购买 nike

我正在开发一个能够接收socket连接的windows服务,所以在OnStart方法中:

protected override void OnStart(string[] args)
{
start();
}

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);
...
}
...
}

问题是不接受连接,而相同的代码在标准命令行项目中运行完美,我怀疑我的设计中存在问题,哪个线程运行 OnStart 方法?,当控制在 await 接受过程后返回 OnStart,是否忽略异步方法,因为它是 Windows 服务中的一种特殊情况?欢迎任何建议

最佳答案

当调用您的 start() 方法时,代码会立即继续并且 OnStart 完成。现在,您自己的代码中没有任何部分能够捕获任何异常。 TaskScheduler 必须捕获异常。但这只会在等待任务或收集垃圾时发生。

因此,基本上,您的代码可能会抛出一个 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.
}
}

关于C#,在 Windows 服务的 OnStart 中调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54998693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com