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