2012-01-15 6 views
0

、私が持っているコード:C#フォームショーと無限大の私のクラスのいずれかでループ

private static void Notify(string url, string author, string mess) 
    { 
     Toast slice = new Toast(100000, url, author, mess) { Height = 90 }; 
     slice.Show(); 
     return; 
    } 

    public void Job() 
    { 
     Notify("http://google.com", "username", "hi all"); 
     while (true) 
     { 
      if (Run() == false) 
       break; 
     } 
     /* .... */ 
    } 

通知機能は、私のテキストと小さなボックスが表示されます。うまくいきますが、ループの後に来たらプログラムがハングアップします。つまり、Notify("http://google.com", "username", "hi all");の後にreturn;を追加すると、プログラムはハングしません。

別のスレッドでこの関数を作成しようとしましたが、何らかの理由で正しく機能せず、「ホワイトリスト」が表示されます。私は間違って何をしていますか、このような状況で何ができますか?悪い英語で申し訳ありません。

+0

メインUIスレッドからしかUI要素を操作できません。UIをロックするため、同じスレッドでエンドレスループを実装しないでください。 –

+0

このループは別のスレッドで実行されています。 – Anton

+0

ええと...あなたの質問には言えません。 *別のスレッドでこの関数を作成しようとしましたが、何らかの理由で正しく動作せず、 "ホワイトリスト"が表示されます* UIスレッドでループを実行すると、何が起こっているのかが正確に説明されます。 –

答えて

0

コメントに記載されていることから、解決策があるかもしれません。

まず、メインUIスレッドからJob()に電話をかけてください。たとえば、UIオブジェクトのイベントハンドラ内で直接、またはUIオブジェクトのInvoke()メソッドへの呼び出し内で実行できます。次のように

その後、私はあなたのコードを変更します

private static void Notify(string url, string author, string mess) 
{ 
    using(Toast slice = new Toast(100000, url, author, mess) { Height = 90 }) 
    { 
     slice.ShowDialog(); 
    } 
} 

public void Job() 
{ 
    Notify("http://google.com", "username", "hi all"); 
} 

注私は完全にループを削除し、私はsliceウィンドウが閉じられるまでのプログラムとの更なる相互作用を防止するためにShowDialog()を使用すること。

また、sliceusing()ブロックに入れました。これは、完了するとDispose()が呼び出される必要があるためです。

+0

複数の「Toast」の場合、私はこれを行います: 'new Thread(()= >新しいToastForm(100000、mess、url、author){Height = 90} .ShowDialog())Start();} – Anton

+0

@Antonあなたは私が言ったことを読んだことはありません。あなたは新しいスレッドでUIオブジェクトを作成しており、UIオブジェクトの 'Dispose()'に失敗しています。 –

+0

'this.Close(); this.Dispose(); 'Toast'では動作しませんか? – Anton

関連する問題