何かを見落としている可能性があることは承知していますが、私が開発したことも、普段は保守していないアプリケーションを修正しようとしているので、単純な間違いを犯している場合は、あらかじめご容赦ください。
現在、特定の機能を実行するときにタイムアウトを引き起こしているこの Web アプリに問題があります。私はそれを 1 つまで追跡しました。ストアド プロシージャを実行しており、ストアド プロシージャが影響を受ける行の数を返すことを期待しています。それはすべてうまくてダンディです。ただし、このストアド プロシージャは 50 秒以上実行され、タイムアウトを引き起こしています。また、これが発生している間、UI が 50 秒間ハングすることは望ましくありません。変更された情報に基づいてデータベース内のいくつかのステータス フィールドを更新しているだけであり、返されるものはエンド ユーザーには役に立たないため、ユーザーがアプリケーションを引き続き使用できるように、トリガーして忘れる必要があります。
タスクの作成とスレッドの作成の両方を試みましたが、何らかの理由で関数がこれが完了するのを待つことを主張しています。
これは、ストアド プロシージャを呼び出す関数です。
public static void UpdateComputerStatusByApplicationID(int ApplicationID)
{
using (SqlConnection Conn = new SqlConnection(GlobalMethods.CONNECTION_STRING))
{
SqlCommand Cmd = new SqlCommand("UpdateComputerStatusByApplicationId", Conn);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@applicationid", SqlDbType.Int).Value = ApplicationID;
Conn.Open();
Cmd.ExecuteNonQuery();
Conn.Close();
}
}
そして、例外は Cmd.ExecuteNonQuery(); から来ています。これはタイムアウト例外です。
これは、関数からタスクとして呼び出している場所です。
public void UpdateApplication(a_Applications newApplication, XPToWin7 xpToWin7)
{
try
{
var orginalApplication = GetApplication(newApplication.AutoNumber);
ObjectContext.ApplyCurrentValues(orginalApplication.EntityKey.EntitySetName, newApplication);
if (xpToWin7 != null)
{
UnlinkXPAppWithWin7App(orginalApplication.AutoNumber);
LinkXPAppWithWin7App(orginalApplication.AutoNumber, xpToWin7);
}
Task UpdateComputerStatus = Task.Factory.StartNew(() =>
{
DAL.UpdateComputerStatusByApplicationID(orginalApplication.AutoNumber);
}, TaskCreationOptions.LongRunning);
SaveChanges();
}
catch (Exception ex)
{
throw new Exception("Exception when updating the application" + ex.Message, ex);
}
}
どこが間違っているのか、なぜ意図したとおりに機能しないのかはわかりませんが、この関数が呼び出されると、cmd.ExecuteNonQuery(); からの内部例外がスローされるまで、UI でハングします。.
どんな助けや提案も大歓迎です!