是否有必要在MVC中请求完成之前等待所有线程的终止

时间:2017-02-01 22:20:28

标签: c# asp.net multithreading thread-safety asp.net-web-api2

我正在开发一个web api项目,其中用户执行某些操作,并且所有相关用户都获得有关用户活动的通知。为了通知每个用户我正在启动一个执行欲望操作的新线程。是否有必要等待此线程在请求​​完成之前终止并将结果返回给用户。

P.S。线程的执行时间可能会随着用户的增加而增加。

如果可能,请建议任何备用

程序逻辑(目前我使用等待函数等待异步函数执行)

public async Task<IHttpActionResult> doSomething(arguments)
{  
    .
    .
    .
    .
    <!-- Perform some operation which includes some database transcations--!>

    if(operation succesed)
    {
        await Notification(userid);
    }

    return result;
}

3 个答案:

答案 0 :(得分:0)

static void Main(string[] args)
{
    var userIds = new[] { 1, 2, 3, 4, 5};

    Console.WriteLine("Updating db for users...");

    // Start new thread for notficiation send-out
    Task.Run(() =>
    {
        foreach (var i in userIds)
            Console.WriteLine("Sending notification for #user " + i);

    }).ContinueWith(t => Console.WriteLine("Notifcation all sent!"));

    Console.WriteLine("Return the result before notification all sent out!");
}

如果删除Task.Run()前面的await(相当于在你的情况下返回Task&lt;&gt;的Notifcation())并运行,那么它将为通知发送创建单独的线程。 / p>

答案 1 :(得分:0)

public async Task<IHttpActionResult> doSomething(arguments)
    {  
     bool isInsertDone ,isUpdateDone = false;

     //create thread list
      var task = new List<Task>();

      // parallel tasks to thread list and execute that tasks 
       task.Add(Task.Run(() =>
          {`enter code here`
              isInsertDone = insertData(arguments)
           }));
           task.Add(Task.Run(() =>
           {
              isUpdateDone  updateData(arguments)
           }));

        // wait for execute all above tasks
         Task.WaitAll(task.ToArray());

        // return response by result of insert and update.
        return Ok<bool>(isInsertDone && isUpdateDone);
    }

答案 2 :(得分:-1)

如果它是一个长时间运行的功能,并且对当前功能没有直接影响,则无需等待。火与忘记。您可以安全地删除等待。

public async Task<IHttpActionResult> doSomething(arguments) {  
    //... Perform some operation which includes some async database transactions

    if(operation succesed) {
        NotificationsAsync(userid); //Start notifications and continue
    }

    return result;
}

我建议使用消息传递队列来处理类似的工作,但这是一个更高级的主题,超出了这个问题的范围。