0

ユーザーが送信したジョブがバックグラウンド サービスによって処理され、Web アプリとバックグラウンド サービス間の通信がデータベース上で行われる Web アプリケーションを構築しています。そのため、検索が開始されると、Web アプリケーションはレコードを db に挿入し、レコードのステータス フィールドが変更されるまで待機します。私が理解しているように、これをリクエスト スレッドに実装すると、プール スレッドの 1 つが不必要にブロックされますが、これを非同期に行うことはできません。この場合のベストプラクティスは何ですか?

4

2 に答える 2

2

SQLDependencyは非常に便利ですが、サーバー側ではソリューションの半分しか提供されませんでした。SignalRを使用して、クエリが終了したことをクライアントに通知することで、残りの半分を克服しました。結局、それは非常に効率的でエレガントなソリューションでした。情報をありがとう!

    public class KYHub : Hub
{
    void OnChange(object sender, SqlNotificationEventArgs e)
    {
        SqlDependency dependency = sender as SqlDependency;
        dependency.OnChange -= OnChange;
        if (e.Info != SqlNotificationInfo.Error && e.Info != SqlNotificationInfo.Delete)
        {
            string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["cnnStr"].ConnectionString;
            SqlConnection conn = new SqlConnection(connstr);
            conn.Open();
            SearchResult result= SearchResult.Parse(conn, Caller.TaskID);
            conn.Close();
            Caller.endsearch(result);
        }
    }

    public void Search(SearchParam search)
    {
        string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["cnnStr"].ConnectionString;
        SqlConnection conn = new SqlConnection(connstr);
        conn.Open();
        search.ClientID = Caller.id;
        int QueryID = search.Save(conn);
        Caller.TaskID = QueryID;
        SqlCommand cmd = new SqlCommand(String.Format("SELECT Completed FROM dbo.Tasks WHERE TaskID={0}", QueryID), conn);
        SqlDependency dep = new SqlDependency(cmd);
        dep.OnChange += OnChange;
        cmd.ExecuteReader();
        conn.Close();
    }
}
于 2012-08-18T19:43:25.227 に答える
0

DB として SQL Server を使用している場合は、SQLDependency と呼ばれる ADO.NET 機能を使用できます。

セットアップが正しく行われた場合のこの量は、(構成する) テーブルに変更があるたびに、C# イベントが発生します。それを解説した記事はこちら

注: これを有効にするには、SQL サーバーをセットアップする必要があります。

http://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-events

そして、これは、テーブルのデータが変更された後にページを更新する方法を説明しています

http://msdn.microsoft.com/en-us/library/e3w8402y%28v=vs.80%29.aspx

于 2012-07-12T12:15:23.033 に答える