1

Thread.sleep(seconds)の使用に問題 があり、すべての実行がスリープ状態で一時停止します。しかし、 for loop も使用して別のソリューションを試しましたが、期待どおりに動作しません。

ログインボタンがクリックされたとき:

  1. アクション レポート="進行中";
  2. さらに2秒後、「データベースに接続しようとしています」となります
  3. データベースを開くと、「データベースが正常に接続されました」のようになります

コードは次のとおりです。

private void Loginbtn_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
   if(userText.Text!=String.Empty && passText.Password!=String.Empty){
   ProgressForm.Visibility = System.Windows.Visibility.Visible;
   LoginForm.Visibility = System.Windows.Visibility.Hidden;
   delay(2);
   actionReport.Text = "Try to Connecting the database";
   String ConnectionString = "server=127.0.0.1;uid=root;pwd='';database=smsdb;";
   MySqlConnection con = new MySqlConnection(ConnectionString);

   try {
      con.Open();
      delay(2);
      actionReport.Text = "Database Connected Sucessfully";
       } 

   catch(MySqlException sqle){
      actionReport.Text = sqle.Message; 
  }
} 
    else {
   MessageBox.Show("Please enter the user name and password to verify","Notification",MessageBoxButton.OK,MessageBoxImage.Information);
     }
 }

private void delay(int seconds) 
{
for(long i=0;i<seconds*3600; i++){
//empty
}

誰か助けてください。

4

3 に答える 3

3

await(C# 5.0 で導入) with を使用するとTask.Delay、これが簡単になります。

public async void Loginbtn_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    actionReport.Text = "Trying to Connecting to the database";
    await Task.Delay(2);
    actionReport.Text = "Connected";
}

C# 4.0 ソリューションの場合、少し面倒ですが、それほど多くはありません。

public async void Loginbtn_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    actionReport.Text = "Trying to Connecting to the database";
    Task.Delay(2).ContinueWith(_ =>
        {
            actionReport.Text = "Connected";
        }, CancellationToken.None
        , TaskContinuationOptions.None
        , TaskScheduler.FromCurrentSynchronizationContext());
}

ここでの重要なポイントは、UI スレッドをブロックするのではなく、UI スレッドに何かをさせる前に 2 秒間イベントの処理を続行させるだけだということです。

于 2013-02-27T20:14:16.647 に答える
0

私はこのような答えを見つけました

delay("Try to Connecting the database");

このように遅れます。

public void delay(string message) {
    var frame = new DispatcherFrame();
    new Thread((ThreadStart)(() =>
    {
        Thread.Sleep(TimeSpan.FromSeconds(2));
        frame.Continue = false;
    })).Start();
Dispatcher.PushFrame(frame);
        actionReport.Text=message;
    }

友よありがとう!私に返信します。

于 2013-03-01T06:08:26.780 に答える
-1

まず、バックグラウンド スレッドで実行中の処理を調べて理解する必要があります。主なルールは次のとおりです。

  1. UI をブロックしないでください
  2. バックグラウンド スレッドから UI スレッドに話しかけないでください。
  3. Thread.Sleep を呼び出す場合は、おそらく間違っています

あなたの質問は、新しいアーキテクチャ パターンを学ぶ機会を示しています。これらは良い候補のようです。

http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

http://www.codeproject.com/Articles/26148/Beginners-Guide-to-Threading-in-NET-Part-1-of-n

于 2013-02-27T20:15:02.623 に答える