3

さまざまなフォームやさまざまなスレッドに基づくアプリケーションで問題が発生しています。アプリケーションが終了する前にスレッドが閉じられますが、それでも 100% の精度でアプリケーションを終了することはできません。

場合によっては、プロセスは引き続き機能しますが、何も表示されません (Formや さえもThread)。問題は program.cs にあると思います。ほぼ間違いないので、ここにコードを貼り付けます。

 private static Process old;
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        XmlConfigurator.Configure();
        if (PriorProcess() != null)
        {
            try
            {
                old.Kill();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ja existe uma instancia do SpotLight em execucao.", "Aviso");
                return;
            }                
        }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Support());

    }



    public static Process PriorProcess()
    {
        Process curr = Process.GetCurrentProcess();
        Process[] procs = Process.GetProcessesByName(curr.ProcessName);
        foreach (Process p in procs)
        {
            if ((p.Id != curr.Id) && (p.MainModule.FileName == curr.MainModule.FileName))
            {
                old = p;
                return p;
            }
        }
        return null;
    }

New Support()アプリケーションに表示される最初のフォームです。

これはスレッドのコードです:

private void check_calls()
{
        while (stop==false)
    {
        string actualTime = DateTime.Now.ToString("T");
        connection = new MySqlConnection(ConnectionString);
        MySql.Data.MySqlClient.MySqlCommand msqlCommand = new MySql.Data.MySqlClient.MySqlCommand();
        msqlCommand.Connection = connection;
        msqlCommand.CommandText = "Select cd.uniqueid,sup.timespan from contactCenterDevel.cc_cdr_support_pending sup, vboxZon.cdr cd WHERE sup.phone=cd.src AND cd.finish=0 AND cd.accountcode='serviin' AND cd.duration >0 AND cd.lastapp='Vxml' ORDER BY cd.calldate DESC LIMIT 1";

        try
        {
            connection.Open();
            MySql.Data.MySqlClient.MySqlDataReader msqlReader = msqlCommand.ExecuteReader();
            while (msqlReader.Read())
            {
                int timespanCompare = convertTimetoSecs(msqlReader.GetString(1));
                int actualtimeCompare = convertTimetoSecs(actualTime);

                if (timespanCompare < actualtimeCompare)
                {
                    updateFlagCDR(msqlReader.GetString(0));
                }
            }
        }
        catch (Exception er)
        { MessageBox.Show("Mysql actions error: " + er); }
        finally
        { connection.Close(); }

       Thread.Sleep(10000);
    }   
}

これは、ログアウト機能でフラグ「停止」がtrueに変更されると停止します。「thread.sleep」にコメントを付けてみましたが、まだ問題が発生しています。

4

3 に答える 3

5

通常、これは終了していないスレッドがいくつかあるために発生します。これを回避するには、非 UI スレッドのステータスに関係なくアプリケーションを終了させたい場合は、IsBackground フラグを true に設定して非 UI スレッドを作成する必要があります。

于 2012-07-17T13:58:27.823 に答える
0

絶対にスレッドを明示的に終了しなければならない優先的な理由がない限り (いくつかあります。たとえば、仕様では、終了時にすべての DB 接続を閉じる必要があり、そのようなスレッドに絶対的にバインドされている接続があります。スレッドを明示的に終了しないでください。

できれば、OSに任せてください。あなたや私が書いたユーザーコードよりもはるかに優れています。

于 2012-07-17T14:53:20.340 に答える