C# 在void C中调用异步方法#
获得了一个将数据保存到DB的void函数,一旦数据被保存,我将尝试调用一个将发送推送通知的函数,该函数应该运行异步,但它没有。我做错了什么C# 在void C中调用异步方法#,c#,asynchronous,task,C#,Asynchronous,Task,获得了一个将数据保存到DB的void函数,一旦数据被保存,我将尝试调用一个将发送推送通知的函数,该函数应该运行异步,但它没有。我做错了什么 public void Save(MyModel m) { using (var conn = Databases.DB) { var d = new DynamicParameters(new { m.Name
public void Save(MyModel m)
{
using (var conn = Databases.DB)
{
var d = new DynamicParameters(new
{
m.Name
});
conn.Execute("INTRANET__CreateTicket", d, commandType: CommandType.StoredProcedure);
//send push notifications
Task.Run(() => SendRaisedTicketNotifications(m));
}
}
private async void SendRaisedTicketNotifications(NewAmbercatTicketView t)
{
await Task.Run(() =>
{
//Send push notifications
var sub = new Subscritption();
var people = UserRepository.List();
foreach (var person in people)
foreach (var sub in UserPushRepository.List().Where(x => x.PersonId == person.PersonId && x.Subscribed))
{
var notification = new PushNotification("Some content")
notification.SendPushNotification(sub);
}
});
}
尝试以下操作以发送通知:
Task.Run(() => SendRaisedTicketNotifications(m)).Wait();
斯蒂芬·克利里(Stephen Cleary)在他的著作中对如何不使用
Task.Run
进行了广泛的介绍
由于您不想等待异步回调完成,您当然可以启动另一个线程,忘记任务。一起运行,因为您无论如何都不会实际使用该任务
public void Save(MyModel m)
{
using (var conn = Databases.DB)
{
var d = new DynamicParameters(new
{
m.Name
});
conn.Execute("INTRANET__CreateTicket", d, commandType: CommandType.StoredProcedure);
//send push notifications in BackgroundThread
Thread sendInBackground = new Thread(new ParametrizedThreadStart(SendRaisedTicketNotifications));
sendInBackground.IsBackground = true;
sendInBackground.Start(m);
}
}
private void SendRaisedTicketNotifications(NewAmbercatTicketView t)
{
//Send push notifications
var sub = new Subscritption();
var people = UserRepository.List();
foreach (var person in people)
foreach (var sub in UserPushRepository.List().Where(x => x.PersonId == person.PersonId && x.Subscribed))
{
var notification = new PushNotification("Some content")
notification.SendPushNotification(sub);
}
}
async void
是一种糟糕的做法。使用async Task
代替Task。Run
出现两次应该已经敲响了警钟。我还想知道为什么SendRaisedTicketNotifications
看起来根本不依赖于它的参数。你到底想在这里发生什么?您只是尝试同步调用该方法,还是希望将其作为后台任务运行?我不确定你们是否知道异步的真正含义。你们是不是想用“火”和“忘”的方式进行调用?这就是你所说的异步吗?@DavidG我想做的就是在后台运行发送过程,这样就不会有任何东西等待它完成,这是否更有意义?这不会运行异步,而是在任务完成之前阻塞线程。但他问,如何在void中调用异步方法。这是我知道的唯一方法。。。