そのため、アプリ内でカレンダー イベントを作成するための UI があります。新しいイベントが作成されると、すべてのユーザー (約 3,000) に対して通知を作成します。各ユーザーが通知を作成するためにデータベースに書き込む必要があるため、これにはしばらく時間がかかります。そのため、から継承するクラスを作成しましたBackgroundWorker
。通知が作成されるかどうかはあまり気にしません (作成しますが、エンド ユーザーの要求を完了するというコンテキストではありません) ので、これは有効なアプローチだと思いました。
しかし、私がそれを実装しようとしたとき、 を呼び出した後でもcontext.Response.End()
、HttpHandler
まだバックグラウンド ワーカーが終了するのを待っています。スレッドをデバッグし、異なるスレッド IDHttpHandler
を持っています。BackgroundWorker
どういうわけか戻ってくるのを黒くしているのか、それともクラスの目的HttpHandler
を誤解しているのかはわかりません。BackgroundWorker
class EventHandler : IHttpHandler
{
...
public void ProcessRequest(HttpContext context)
{
...
// I need this to finish before the response ends
CalendarEvent event = CreateCalendarEvent();
List<int> users = GetUsersFromDB();
if(event != null) // The event was created successfully so create the notifications
{
// This may take a while and does not effect the UI on
// client side, so it can run in the background
NotificationBackgroundWorker notificationWorker = new NotificationBackgroundWorker(notification, users);
notificationWorker.RunWorkerAsync();
} else {
...
// Log Error and set status code for response
...
}
...
context.Response.End()
}
...
}
class NotificationBackgroundWorker : BackgroundWorker
{
private Notification notification;
private List<int> users;
public NotificationBackgroundWorker(Notification newNotification, List<int> usersToNotify) : base()
{
this.notification = newNotification;
this.users = usersToNotify;
this.DoWork += DoNotificationWork;
}
private void DoNotificationWork(object sender, DoWorkEventArgs args)
{
CreateUserNotifications(notification, users);
}
private void CreateUserNotifications(Notification notification, List<int> userList)
{
// This is where the bottleneck is occurring because there
// is one DB write per user
foreach (int userId in userList)
{
...
// Create the notification for each user
...
}
}
}
どんな洞察も素晴らしいでしょう。事前にたくさんありがとう!