2017-01-23 5 views
0

Итак, ради изучения использования потоков, я сделал небольшую программу, которая должна принимать имена и хранить их в списке, а затем показывать имена в другой форме один за другим. Итак, вот код:Когда я использую Threads для вызова другой формы и покажу ее, компоненты (метка) не работают должным образом

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 

namespace ListingThread 
{ 
public partial class Form1 : Form 
{ 
    public Thread t; 
    public static int ShowNo = 0; 
    public Form1() 
    { 
     InitializeComponent(); 
     GlobalForm = new Form(); 
     GlobalForm.Show(); 
     GlobalForm.Hide(); 
     t = new Thread(ShowList); 
    } 
    public Form GlobalForm; 
    public static List<string> Names = new List<string>(); 
    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void btnAddName_Click(object sender, EventArgs e) 
    { 
     AddName(txtName.Text); 
     txtName.Text = null; 
    } 
    public void AddName(string x) 
    { 
     Names.Add(x); 
    } 

    private void btnShow_Click(object sender, EventArgs e) 
    { 
     Showw(); 
    } 
    public void Showw() 
    { 
     t.Start(); 
    } 
    public void ShowList() 
    { 
     if (ShowNo < Names.Capacity) 
     { 

      GlobalForm.Invoke((MethodInvoker)delegate() 
      { 
       CustomMessageBox Msg = new CustomMessageBox(); 
       try { Msg.lblName.Text = Names[ShowNo]; 
       } 
       catch 
       { 
        t.Abort(); 
       } 
       Msg.Show(); 
       Thread.Sleep(500); 
       Msg.Close(); 
       ShowNo++; 
       ShowList(); 
      }); 
     } 
     else 
     { 
      t.Abort(); 
     } 
    } 
} 
} 

Другая форма просто имеет один ярлык с именем lblName: The Second Form http://image.prntscr.com/image/5b8bd837c5a849adbf3531ed7e366424.png

Но когда я запускаю это происходит: /: Program Running

Как вы можете видеть , эти метки не работают должным образом:/ Они показаны следующим образом: Broken Label http://image.prntscr.com/image/1a0f9731f8f74fc1914ce8622a9f7a72.png

+0

'ShowNo ' Names.Count' возможно? – AlexD

+0

Я изменил его на то, что вы сказали, но он все еще не работает: /. Я думаю, что проблема здесь немного сложнее. – Anopey

+0

Форматы блеба должны работать на потоке пользовательского интерфейса. – stuartd

ответ

1

Я бы предложил использовать Timer вместо Thread.Sleep, чтобы не блокировать поток пользовательского интерфейса, поскольку сон предотвратит обновление метки.

while (ShowNo < Names.Count) 
     { 
      CustomMessageBox Msg = new CustomMessageBox(); 
      GlobalForm.Invoke((MethodInvoker)delegate() 
      { 
       try 
       { 
        Msg.lblName.Text = Names[ShowNo]; 
        Msg.Show(); 
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
        timer.Interval = 2000; 
        timer.Tick += (s, e) => Msg.Close(); 
        timer.Start(); 
       } 
       catch 
       { 
        t.Abort(); 
       } 
       ShowNo++; 
      }); 
     } 

В стороне, нет необходимости отменять нить после ее завершения. Я бы также использовал цикл while вместо вызова рекурсивного метода.