4

私は次のコードを持っています:

Hide()
if(a > b)
{
label.Text = "a is greater than b";
Show();
Thread.Sleep(50000);
}

私がやろうとしているのは、アプリが起動したらすぐにWinFormを非表示にすることです。いずれかの時点でa>bの場合、ラベルにそのメッセージを含むWinFormが50秒間表示され、再び非表示になります。また、ラベルはautosize=trueに設定されています。

上記のコードは機能しますが、ラベルにテキストが表示されていませんか?また、これはスレッドスリープを使用してしばらくの間winforを表示するための正しいアプローチですか?

4

4 に答える 4

5

Thorstenは正しいです。SleepはUIスレッドをフリーズしているため、UIは更新されませんが、回避策として次のようなことを行うこともできます。

Hide()
if(a > b)
{
    label.Text = "a is greater than b";
    Show();
    Refresh();
    Thread.Sleep(5000);
}

しかし、もちろん最もクリーンなソリューションは次のとおりです。

Hide()
if(a > b)
{
    label.Text = "a is greater than b";
    Show();
    Task.Factory
        .StartNew(() => Thread.Sleep(5000))
        .ContinueWith(() => Close(), TaskScheduler.FromCurrentSynchronizationContext());
}

ただし、タスク並列ライブラリを使用するには、適切なusing句を追加することを忘れないでください。

using System.Threading.Tasks;

TPLは、.NET4以降で使用できます。詳細はこちら: http: //msdn.microsoft.com/en-us/library/dd460717.aspx

于 2012-12-06T16:39:37.293 に答える
4

上記のように、それはスリープのためであり、UIにはまだそれを更新する時間がありません。

ただし、タイマーを使用する必要はありません。DoEvents()は、UIを更新するための時間を与えます。

試す

   Hide();
if(a > b)
{
    label.Text = "a is greater than b";
    Show();
    System.Windows.Forms.Application.DoEvents();
    Thread.Sleep(50000);
}
于 2012-12-06T16:43:40.413 に答える
3

これは、がThread.Sleep原因でアプリケーションが現在のスレッドを一時停止するためです。これは、これらの50秒間、フォームで更新が発生しないことを意味します。

目的を達成するために必要なことは、50秒後に経過するタイマーを開始し、タイマーのコードでフォームを非表示にすることです。

タイマーは、フォームに配置されたWindowsフォームタイマーコンポーネントにすることができます。

于 2012-12-06T16:31:44.977 に答える
0

UIクラスでスレッドを一時停止しないでください。最後に必要なのは、応答しないインターフェイスです。

于 2012-12-06T16:39:47.617 に答える