2010-05-19 8 views
5

donar ve hiçbir sorunWinForms formu form (F1) i başka bir form oluşturursanız (diyoruz F2 sağlar) hangi bir düğme var On

olmadığını göstermek ama böyle bir şey yapmak istiyorum

Uygulamamdaki bazı iş parçacıkları bir bağlantı yayınlıyor ve bir sunucudan iletileri dinliyor. Bir mesaj geldiğinde, ana formum, bir işlevi çalıştıran bir olayı almak için kaydedilir. Bu fonksiyondan, F2 tipi formu oluşturmaya ve göstermeye çalışıyorum (boş, değiştirilmiş hiçbir şey yok): bunu gösteriyor ancak uygulamayı donduruyor.

daha tam olarak:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived; 
    } 

    private void Form1_OnMessageReceived(object sender, MessageEventArgs e) { 
     Form2 f2 = new Form2(); 
     f2.Show(); 
    } 
} 
+0

Donmaya neden olduğunu düşündüğünüz satırları yakalamayı denediniz mi? – Terry

+0

C# formları yok. –

+0

, f2.Show() öğesinden sonra donma meydana gelir. hata yok, istisna yok. Benim tahminim, formun pratik olarak başka bir iş parçacığı üzerinden başlatılmasından kaynaklanıyor olabilir. –

cevap

7

Ben nedeni çapraz iplik işlemlerini gerçekleştirdiği olduğunu düşünüyorum. Formun oluşturulmasını form2 oluşturmadan önce UI iş parçacığına koymanız gerekir. Aşağıdaki nihayet bu lazım Ram 'kodunu kullanarak size

public delegate void ShowForm(object sender, MessageEventArgs e); 
    public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
     ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived; 
    } 

    private void Form1_OnMessageReceived(object sender, MessageEventArgs e) 
    { 
     if (this.InvokeRequired) 
     { 
      this.BeginInvoke(new ShowForm((Form1_OnMessageReceived), new object[] { sender, e })); 
     } 
     else 
     { 
      Form2 f2 = new Form2(); 
      f2.Show(); 
     } 
     } 
    } 
+0

sanırım "this.BeginInvoke (new ShowForm (yeni nesne [] {sender, e})); hat. "Hata CS0149: Yöntem adı bekleniyor" diyor –

+0

@andrew - şimdi, hedef adını koymayı unuttum :). – Ram

2

yardımcı olacağını düşündüğümüz ve

thanx çalışıyor!

public delegate void ShowForm(object sender, MessageEventArgs e); 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived; 
    } 

    private void Form1_OnMessageReceived(object sender, MessageEventArgs e) 
    { 
     ShowForm2(sender, e); 
    } 

    private void ShowForm2(object sender, MessageEventArgs e) 
    { 
     if (this.InvokeRequired) 
     { 
      ShowForm f = new ShowForm(ShowForm2); 
      this.Invoke(f, new object[] { sender, e }); 
     } 
     else 
     { 
      Form2 f2 = new Form2(); 
      f2.Show(); 
     } 
    } 
} 
İlgili konular