質問
トランザクションデータベースに情報を記録するだけの簡単なasmx Webサービスがあります。ただし、クライアントのタイムアウトです。データベースを更新するための呼び出しは、1つのストアドプロシージャを呼び出すだけであり、パフォーマンスを向上させるためにさらに最適化できるとは思いません。 log4netを使用して実行をログに記録し、データベースを更新する別のプロセスでログを読み取るようになりました。
これを行うより良い方法があるかどうか疑問に思っていました。私のコードに次のようなことをさせる方法があるかどうか疑問に思っていました:
public bool method(...)
{
LogRun(...)
Asynchronously call method to insert transaction
return true;
}
解決
編集: BackgroundWorkerについて間違っていました。それで、私はそれをテストしてスレッドバージョンに変更しました。
作業を非同期で行う場合は、別のスレッドを開始する方法を学習できます。
public class Service1 : System.Web.Services.WebService
{
[WebMethod]
public void Log(int foo, int bar)
{
Thread a = new Thread(new ThreadStart(delegate()
{
// Do some processing here
// For example, let it sleep for 10 secs
Thread.Sleep(10000);
}));
a.Start();
}
}
Logメソッド自体にThread.Sleep(10000)行がある場合、Logメソッドの処理が完了するまでに10秒かかります。ただし、 Thread a の場合、Logメソッドは呼び出しの直後に戻ります。
また、このスタイルの非同期呼び出しでは、挿入操作が完了したかどうかを呼び出し側クライアントに保証する簡単な方法はありません。
他のヒント
試してみたいことがあるのは、トレースです。
クエリをこれ以上最適化できない場合は、 SQLクライアントのタイムアウト値は、SQLサーバーを使用している可能性があることを前提としています。
Webサービスを使用するクライアント側では、クライアントに他の操作の実行を継続させる場合、そのメソッドを非同期で使用できます。 Webメソッドが完了すると、イベントがトリガーされます。良い例がありますここで読むことができます役立つと思われる場合。
webmethod内で非同期操作を行うことはできますが、スレッドやasp.net内のスレッドプールで作業しているため、すでにマルチスレッド操作が実行されています。技術的には可能ですが、httpruntimeがサービスへのリクエストを処理する際にリソースを管理するため、システムを誤ってリソースから奪うこともできます。
ローカルlog4netファイルへの書き込みとそのデータのオフラインルーチンへのインポートは、SQLサーバーがオフラインでもサービスが引き続き利用できるため、リアルタイムロギング、非同期などの場合よりも可用性が高くなります。ロギング以外にsqlサーバーを必要としない場合、dbオペレーションをwebmethodから除外することをお勧めします。
それがクライアントへの単なる呼びかけの呼び出しである場合、Webサービスは詳細をキューに追加してクライアントに戻るだけです。 MSMQを使用して、説明している内容に似たものを実装しました。データベースのタイムアウトは修正されませんが、クライアントからエラーメッセージが削除されます。