3

Webサービスを作成していますWebサービス
内で、いくつかの処理を実行します。これは非常に高速で、SmtpClient.SendAsync()を使用して2〜3通の電子メールを非同期で送信します。

私の問題は、それらが非同期で送信されているにもかかわらず、サービスを終了してユーザーに応答を返す前に、それらが処理を終了するのを待たなければならないことです。SendCompletedEventHandlerが起動するのを待たないと、電子メールは送信されません。メールサーバーが応答するのに時間がかかる場合があります。

ユーザーは、電子メールが送信されたかどうかを実際に知る必要はありません。メールを送信して別の場所で処理し、できるだけ早くユーザーに返信できるようにすると便利です。

誰かがこれに対する良い解決策を持っていますか?たぶん私は自分の検索を間違って表現しているかもしれませんが、私は解決策を考え出していません。

4

2 に答える 2

1

新しいスレッドを起動して送信を行うことができます。

ThreadPool.QueueUserWorkItem(delegate {
    SmtpClient client = new SmtpClient();
    // Set up the message here
    using (MailMessage msg = new MailMessage()) {
        client.Send(msg);
    }
});
于 2012-08-17T00:20:40.603 に答える
0

これは、私がテストしてWCFで動作する完全な例です。制御はすぐにクライアントに戻され、サーバーは送信を開始し、遅延をシミュレートするためにスリープしてから終了します。System.ServiceModelへの参照を追加するだけで、必要なクラスを取得できます。

class Program
{
    static void Main(string[] args)
    {
        ServiceHost host = new ServiceHost(typeof(HelloWorldService), new Uri("http://localhost:3264"));
        ServiceMetadataBehavior mdb = new ServiceMetadataBehavior();
        mdb.HttpGetEnabled = true;
        host.Description.Behaviors.Add(mdb);
        host.Open();

        Console.WriteLine("Service Hosting...");
        Console.ReadLine();
    }
}

[ServiceContract]
class HelloWorldService
{
    [OperationContract]
    public void SendEmails()
    {
        Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Start Sending Emails...");
            Thread.Sleep(10000);
            Console.WriteLine("Finish Sending Emails...");
        });
    }
}

}

于 2012-08-17T07:12:01.047 に答える