Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在void C中调用异步方法#_C#_Asynchronous_Task - Fatal编程技术网

C# 在void C中调用异步方法#

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

获得了一个将数据保存到DB的void函数,一旦数据被保存,我将尝试调用一个将发送推送通知的函数,该函数应该运行异步,但它没有。我做错了什么

    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中调用异步方法。这是我知道的唯一方法。。。