gpt4 book ai didi

c# - 如何从 ElapsedEventHandler 中调用异步方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:42 25 4
gpt4 key购买 nike

我将使用 Windows 服务定期(每两分钟)发送电报消息。我的 Windows 服务启动正常,2 分钟后停止。我检查了我的代码,发现这是因为异步。我该如何解决这个问题?

protected override void OnStart(string[] args)
{
//< I declared a System.Timers.Timer to send new Telegram messages.
aTimer = new System.Timers.Timer(120000); // 2 minutes
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Enabled = true;

GC.KeepAlive(aTimer);
//>
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
SendNewMessages();
}

async static void SendNewMessages()
{
MyDataContext myDB = new MyDataContext();
var newMessages = myDB.TelegramMessages.Where(tm => tm.Status != "New Message");

foreach (TelegramMessage newMessage in newMessages)
{
try
{
var store = new FileSessionStore();
var client = new TelegramClient(store, "MySession");
await client.Connect();

var res = await client.ImportContactByPhoneNumber(newMessage.ReceiverPhoneNumber);
await client.SendMessage(res.Value, newMessage.Message);

newMessage.Status = "Sent";
myDB.SubmitChanges();
}
catch (Exception ex)
{
newMessage.Status = ex.Message;
myDB.SubmitChanges();
}

Thread.Sleep(5000);
}
}

最佳答案

我直接看到的一件事是,自从“SendNewMessages”返回 void 以来,async/await 并没有一直实现到事件处理程序。而且您的事件处理程序不是异步的。

According to MSDN on "Async Return Types (C# and Visual Basic)"

The primary use of the void return type (Sub procedures in Visual Basic) is in event handlers, where a void return type is required. A void return also can be used to override void-returning methods or for methods that perform activities that can be categorized as "fire and forget."

这很可能是您的场景中的一个问题,因此您可以尝试将 SendNewMessage 更改为此

async static Task SendNewMessages()

还有你的事件处理程序

private async static void OnTimedEvent(object source, ElapsedEventArgs e)
{
await SendNewMessages();
}

更新

向您的“SendNewMessages”方法添加一些错误处理代码也是一个好主意,因为如果抛出异常,您的服务将退出。

async static Task SendNewMessages()
{
try
{
... Your code here
}
catch(Exception e)
{
... exceptionhandling here
}
}

目前您的 foreach 中只有异常处理,但您的数据库代码没有任何错误处理(据我所知)。

如果这里抛出异常

MyDataContext myDB = new MyDataContext();
var newMessages = myDB.TelegramMessages.Where(tm => tm.Status != "New Message");

foreach (TelegramMessage newMessage in newMessages)

或在这里:

newMessage.Status = ex.Message;
myDB.SubmitChanges();

服务将结束

关于c# - 如何从 ElapsedEventHandler 中调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36661338/

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