1

トランザクションデータベースにいくつかの情報を記録するだけでよい単純なasmxWebサービスがあります。ただし、クライアントのタイムアウトです。データベースを更新するための呼び出しは、1つのストアドプロシージャを呼び出すだけであり、パフォーマンスを向上させるためにさらに最適化できるとは思いません。log4netを使用して実行をログに記録し、データベースを更新する別のプロセスによってログインを読み取るようになりました。

これを行うためのより良い方法があるかどうか疑問に思いました。私のコードに次のようなことをさせる方法があるかどうか疑問に思いました:

public bool method(...)
{
  LogRun(...)

  Asynchronously call method to insert transaction

  return true;  
}
4

5 に答える 5

0

クエリをこれ以上最適化できない場合は、SQLサーバーを使用している可能性があると想定して、SQLクライアントのタイムアウト値を増やすことができます。

Webサービスを使用するクライアント側では、クライアントに他の操作の実行を継続させたい場合は、そのメソッドを非同期で使用できます。Webメソッドが終了すると、イベントがトリガーされます。あなたがそれが役立つかもしれないと思うなら、あなたがここで読むことができる素敵な小さな例があります。

于 2008-12-30T15:07:48.343 に答える
0

試してみたいことの 1 つはTracingです。

于 2008-12-30T14:43:15.053 に答える
0

編集: BackgroundWorker については間違っていました。そこで、テスト済みの Thread バージョンに変更しました。

作業を非同期で実行したい場合は、別のスレッドを開始する方法を検討できます。

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

Thread.Sleep(10000) 行が Log メソッド自体にある場合、Log メソッドが処理を完了するのに 10 秒かかります。ただし、Thread aを使用すると、 Log メソッドは呼び出しの直後に戻ります。

また、このスタイルの非同期呼び出しでは、挿入操作が完了したかどうかを呼び出し元のクライアントに保証する簡単な方法がないことに注意してください。

于 2008-12-30T14:54:31.087 に答える
0

webmethod 内で非同期操作を実行することを確認できますが、既にマルチスレッド操作が実行されている asp.net 内でスレッドやスレッドプールを操作しています。技術的には実現可能ですが、サービスへのリクエストを処理する際に httpruntime がリソースを管理するため、システムのリソースをうっかり奪ってしまう可能性もあります。

ローカルの log4net ファイルに書き込み、そのデータをオフライン ルーチンでインポートすると、SQL サーバーがオフラインになってもサービスを引き続き利用できるため、非同期またはその他のリアルタイム ロギングよりも可用性が高くなります。ロギング以外の目的で SQL サーバーを必要としない場合は、db 操作を webmethod から除外することをお勧めします。

于 2008-12-30T16:12:02.880 に答える
0

それがクライアントに対する単純な呼び出しである場合、Web サービスは詳細をキューに追加してクライアントに返すことができます。私は MSMQ を使用して、あなたが説明しているものに似たものを実装しました。データベースのタイムアウトは修正されませんが、クライアントからエラー メッセージが表示されなくなります。

于 2008-12-30T16:49:55.063 に答える