2017-02-01 4 views
1

私はユーザーが何らかのアクションを実行し、すべての関連ユーザーがユーザーアクティビティに関する通知を受け取るWeb APIプロジェクトを作成しています。すべてのユーザーに通知するために、私は欲望のアクションを実行する新しいスレッドを開始しています。リクエストが完了して結果をユーザに返す前に、このスレッドが終了するのを待つ必要があります。MVCで要求が完了する前にすべてのスレッドが終了するのを待つ必要があります

P.S.スレッドの実行時間は、ユーザーがいない場合に増加することがあります。

長時間実行されている機能になるだろうとされている場合は

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

あなたがTask.Runの前でawaitを削除した場合()(あなたのケースでは、タスク<を返しNotifcationに相当()>)および実行それが通知送出のための別のスレッドを作成します。

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); 
    } 
関連する問題