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

时间:2019-03-05 08:47:32

标签: c# asynchronous async-await windows-services

我正在开发一种能够接收套接字连接的Windows服务,因此请使用Function XLBlank() For Each sh In ActiveWorkbook.Worksheets sh.Activate Cells(1, 1).Select lRow = Cells.Find(What:="*", _ After:=Range("A1"), _ LookAt:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Range("A" & lRow + 1, Range("A1").SpecialCells(xlCellTypeLastCell).Address).Select On Error Resume Next Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete Cells(1, 1).Select ActiveWorkbook.Save Next ActiveWorkbook.Worksheets(1).Activate ActiveWorkbook.Save End Function 方法:

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经过OnStart接受过程后,异步方法是否被忽略,因为在Windows服务中这是一种特殊情况?欢迎任何建议

2 个答案:

答案 0 :(得分:1)

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

因此,基本上,您的代码可能抛出了 if (resultCode == RESULT_OK) { switch (requestCode) { case PLACE_PICKER_REQUEST: assert data != null; Place place = Autocomplete.getPlaceFromIntent(data); String placeName = Objects.requireNonNull(place.getAddress()).toString(); } } ,直到Exception被垃圾回收之前,它一直未被观察。为了更快地捕获日志异常,请始终确保在无法在任何地方等待的方法中捕获异常:

Task

答案 1 :(得分:0)

在Windows防火墙中似乎是一个问题,当我将代码作为控制台应用程序进行测试时,我从Windows防火墙收到一条确认消息,要求获得打开端口的权限,但是当我将其作为服务进行测试时,防火墙静默阻止传入的连接,而无需任何通知。