2013-06-12 2 views
1

Моя программа работает следующим образом:Не удается выполнить многозадачность, создает ошибки?

Его программа, с которой вы можете выключить сервер, имеет несколько событий триггера. вы должны установить время для фактического обратного отсчета в программе, чтобы увидеть его в игре.

(пример)

если вы нажмете 1 час (техническое обслуживание) внутриигровой литая бы сказал, что будет обслуживание в течение 1 часа. , чем вы выбрали (15 минут) продолжительности обслуживания. (автоматическое обслуживание). вы нажимаете кнопку выключения, триггеры начинают уходить.

В точке запуска запускается рабочий, где начинается фактическая работа. altho ... его работа, но не так, как я этого хочу.

я хочу, чтобы это сделать:

(do_this первым) (ждать этого, чтобы закончить и подтвердить, что соединение с базой данных было закрыто) (сделайте следующую функцию в списке) и так далее.

в настоящее время код выглядит следующим образом:

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."); 
     } 


    } 

раз я выполнить программу, все события работают, кроме рабочего, (он работает, но застревает на первой работе, он заканчивает его, но чем он держит зацикливание. работа 1, а я 2 рабочих места в списке.

Кроме того, когда он начинает первую работу, это дает мне Wich ошибки исключения в первой работе.

(первое задание)

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!"); 
      } 
     } 
    } 

так что у меня есть странная ситуация, из-за которой я просто не могу выбраться.

он работает, но зацикливается на задании1, а также t продолжает говорить «« OPT не обнаружен или некорректен », в то время как все в зашифрованном файле opt правильное. (это сработало раньше, но я не хочу, чтобы две команды sql запускались одновременно с причиной возникновения взаимоблокировок.)

+0

Ну, прежде всего, ваш заголовок вопроса * далеко * слишком расплывчатый, * * Невозможно выполнить многозадачность, создает ошибки * "- какие именно ошибки, какие строки? Также какой класс/объект «OPT»? – James

+0

раздел OPT работает нормально, ошибка получается из исключения job1. '' OPT не обнаружен или команда OPT неверна! '', Но в то же время он говорит, что он выполнил job1. и он действительно это сделал. – user1547355

+0

"* Он продолжает говорить:« OPT не обнаружен или не указана некорректно »* - это означает, что возникает исключение, вы проверили, какое именно * исключительное исключение оно есть? С самого начала вы можете взять свойство «Message» из исключения, а не выводить свои собственные, это может дать вам подсказку о том, что происходит.Кроме того, как правило, никогда не рекомендуется поймать «Исключение» в любом случае, так как это слишком * слишком широко, вы должны поймать определенные исключения, которые вы можете обработать. – James

ответ

0

Вы проглатываете свое исключение, так сказать, просто показывая произвольное сообщение. Вместо этого воспользоваться Exception случая, предусмотренного в catch:

catch (Exception ex) { 
    MessageBox.Show(ex.Message); 
} 

Хотя, я бы не обязательно закрывать глаза бросали диалоги, вы можете использовать отладчик, чтобы сломать в catch блоке, опрашивать вещи и вещи, и исправьте проблему.

+0

Уже изменил это, но спасибо! Возможно, вы знаете, как я делаю это для выполнения одной задачи, а затем выполняю другую задачу и добавляю функцию ожидания между этими двумя? (no thread.sleep) причина, которая приведет к ошибке программы/застрял – user1547355

+0

Если вы изменили ее и получили сообщение, сообщите нам об ошибке. –

+0

Я уже исправил эту ошибку, проблема в том, что она запускает 2 функции в одно и то же время, поэтому мне нужно, чтобы она запускала только одну функцию, когда эта функция завершена, она должна начинать следующий и т. Д. – user1547355

Смежные вопросы