Как я узнаю, что мой поток уже завершил выполнение задач? (C # winforms) - PullRequest
1 голос
/ 29 сентября 2010

С кодом ниже, как я узнаю, что мой поток уже завершил выполнение задач? Моя цель - убить этот поток, чтобы освободить память. Или как мне это сделать?

private delegate void DelegateSetProperties(DataTable dataSource, string valueMember, string displayMember);

    Thread thread1;
    DelegateSetProperties delegateSetProperties;

    private void Form1_Load(object sender, EventArgs e)
    {
        delegateSetProperties = new DelegateSetProperties(SetProperties);

        thread1 = new Thread(new ThreadStart(InitValues));
        thread1.IsBackground = true;
        thread1.Start();
        // should I abort thread1 here? if I abort it, does it frees the memory occupied by thread1?
    }

    private void SetProperties(DataTable dataSource, string valueMember, string displayMember)
    {
        comboBox1.DataSource = dataSource;
        comboBox1.ValueMember = valueMember;
        comboBox1.DisplayMember = displayMember;
        comboBox1.SelectedIndex = 0;
    }      

    void InitValues()
    {
        var dt = new DataTable
                {
                    TableName = "CATEGORY",
                    Columns = {
                                {"CategoryCode", typeof(string)},
                                {"Name", typeof(string)},
                              }
                };

                dt.Rows.Add("C1", "Category1");
                dt.Rows.Add("C2", "Category2");
                dt.Rows.Add("C3", "Category3");
                // and so on...
        comboBox1.Invoke(delegateSetProperties, new object[] { dt, "CategoryCode", "Name" 

});
    }

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Никогда не прерывайте поток, если ваш процесс неизлечимо болен и все равно умрет. Случаются очень плохие вещи (например, безвозвратные замки). Код в порядке , как и . Когда закончится метод InitValues, закончится и поток.

Если метод InitValues является кратким, возможно, рассмотрим ThreadPool, но в противном случае; оставь это.

Вы могли бы захотеть добавить некоторую обработку исключений, так что если InitValues сгенерирует, это не уничтожит весь AppDomain, и вы должны понимать, что большинство из время здесь будет потрачено на обновление пользовательского интерфейса в потоке пользовательского интерфейса (если ваша таблица не заполняется из внешнего источника, а процедурная Rows.Add является просто иллюстративной).

0 голосов
/ 29 сентября 2010

Один из вариантов - Thread.Join. Это заставит основной поток ждать завершения дочернего потока, прежде чем продолжить.

Другой вариант - изучить System.ComponentModel.BackgroundWorker. Это управляемый класс потоков, предоставляемый MS. Он сообщит вам, когда он будет завершен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...