0

私のプログラムは次のように動作します:

サーバーをシャットダウンできるプログラムで、複数のトリガーイベントがあります。印刷されたゲームで実際のカウントダウンを表示するには、プログラムで実際のカウントダウンの時間を設定する必要があります。

(例)

ゲームキャストで 1 時間 (メンテナンス) をクリックすると、1 時間後にメンテナンスが行われると表示されます。次に、(15 分) メンテナンス期間を選択します。(自動メンテナンス)。シャットダウンを押すと、トリガーがオフになり始めます。

ある時点でトリガーがワーカーを開始し、実際の作業が開始されます。ただし...動作していますが、希望どおりではありません。

私はそれをしたい:

(do_this first) (これが終了するのを待って、データベース接続が閉じられたことを確認する) (リストの次の機能を実行する) など。

現在、コードは次のようになります。

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {

        try
        {
            //Create Thread for multitask
            Thread Del_Char_Related_WORKER = new Thread(new ThreadStart(Del_Char_Related));
            Thread Del_Null_Item_WORKER = new Thread(new ThreadStart(Del_Null_Item));

            //Start Multitask
              Del_Char_Related_WORKER.Start();

              Del_Null_Item_WORKER.Start();
        }
        catch (Exception)
        {
            MessageBox.Show("Worker Got Tired of Working.");
        }
        

    }

プログラムを実行すると、ワーカーを除くすべてのイベントが機能します (機能しますが、最初のジョブでスタックします。彼はそれを終了しますが、2 つのジョブがリストされている間、ジョブ 1 をループし続けます。

また、最初のジョブを開始すると、最初のジョブにある例外エラーが発生します。

(最初の仕事)

    void Del_Char_Related()
    {
        if (checkBox3.Checked == true)
        {
            try
            {
                string connect = string.Format("Data Source={0},{1};Initial Catalog={2};User Id={3};Password={4};",
                OPT.GetString("db.server"),
                OPT.GetString("db.port"),
                OPT.GetString("db.name"),
                OPT.GetString("db.account"),
                SFM.GetDecryptMD5(OPT.GetString("db.password"));

                SqlConnection sqlcon = new SqlConnection(connect);
                sqlcon.Open();
                new SqlCommand("DECLARE @Rows INT,@sid INT,@acc_id INT SET @Rows = 1 WHILE (@Rows > 0) BEGIN SET @sid = (SELECT TOP(1) sid FROM dbo.Character WHERE name LIKE '%@%') SET @acc_id = (SELECT TOP(1) account_id FROM dbo.Character WHERE name LIKE '%@%') DELETE TOP (1) FROM dbo.Character WHERE name LIKE '%@%' SET @Rows = (SELECT count(sid) FROM dbo.Character WHERE name LIKE '%@%') DELETE FROM dbo.Item  WHERE owner_id = @sid OR account_id = @acc_id DELETE FROM dbo.ItemCoolTime WHERE owner_id = @sid DELETE FROM dbo.State WHERE owner_id = @sid DELETE FROM dbo.Quest WHERE owner_id = @sid DELETE FROM dbo.QuestCoolTime WHERE owner_id = @sid DELETE FROM dbo.Skill WHERE owner_id = @sid DELETE FROM dbo.Guild where leader_id = @sid END", sqlcon).ExecuteNonQuery();
                Thread.Sleep(60000);
                sqlcon.Close();
                MessageBox.Show("Ive completed my duty (TASK1)");
            }
            catch (Exception)
            {
                if (OPT.GetString("db.port") == "")
                {
                    MessageBox.Show("Unable to detect a PORT!");
                }
                MessageBox.Show("No OPT detected or OPT command incorrect!");
            }
        }
    }

なかなか抜け出せない変な状況。

それは機能しますが、暗号化された opt ファイルのすべてが正しいにもかかわらず、「OPT が検出されないか、コマンドが正しくありません」と言い続けるよりも、job1 でループします。(これは以前は機能していましたが、デッドロックのリスクが発生してサーバーが切断される可能性があるため、2つのSQLコマンドを同時に起動したくありません。)

4

1 に答える 1