2017-02-01 1 views
1

Я работаю над проектом веб-api, в котором пользователь выполняет некоторые действия, и все связанные пользователи получают уведомление о деятельности пользователя. Чтобы уведомить каждого пользователя, я начинаю новый поток, который выполняет действие желания. необходимо дождаться завершения этого потока до завершения запроса и возврата результата пользователю.необходимо дождаться завершения всех потоков до того, как запрос будет завершен в MVC

P.S. Время выполнения для потока может увеличиться без пользователя.

Пожалуйста Предлагайте любой заместитель, если это возможно

Программа Logic (В настоящее время я использую ждут функцию ожидания функции асинхронной выполнить)

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

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

    return result; 
} 
+0

Пожалуйста, покажите свой код - как вы начинаете нить, как вы оповещать пользователь и как вы ждете окончаний –

+0

нити @SergeyBerezovskiy я обновляемые вопрос с логикой программы. Пожалуйста, дайте мне знать, если это ясно для вас. –

ответ

-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; 
} 

Я предложил бы использовать очереди сообщений для работы, как это, но это более сложная тема, которая выходит за рамки данного вопроса.

+0

После удаления подождите, я предупреждаю, что нить не завершена. P.S. Функция уведомления использует dbcontext определяет в контроллере, поэтому мне нужно было создать локальный экземпляр dbcontext для функции –

+0

Да, компилятор покажет предупреждение, но он работает. – Nkosi

+0

Хорошо Спасибо @Nkosi за ваше время –

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!"); 
} 

Если удалить await перед Task.Run() (эквивалент Notifcation(), который возвращает Task <> в вашем случае) и запустить, то она будет создавать отдельный поток для уведомления отправки отказа.

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); 
    } 
Смежные вопросы