0

イーサネットプロトコルを使用していくつかのplcデータを読み取るために、c#で小さなアプリケーションを作成しました。イーサネット ソケット、開閉は .dll ライブラリ内に保存されます。今、私はこのパブリックメソッドを使用しています:

    public static string readdata()
    {
      try
      {
        ...
        return (plcdata());
      }
      catch
      {}
    }

私の疑問: plcdata() (.dll のメソッド) が数秒待機している場合 (たとえば、通信が遅いなど)、アプリケーションがフリーズしている可能性があります。

だから、私は次のように返された文字列に EventHandler を追加しようとします:

    private static TextBox auxDataTextBox = new TextBox();

    public static void goRead()
    {            
        auxDataTextBox.TextChanged += new EventHandler(auxDataIncoming);
        auxDataTextBox.Text = plcdata();
    }

    private static void auxDataIncoming(object sender, EventArgs e)
    {      
        // Do something
    }

この場合、「plcdata()」が変更されると、auxDataIncoming が発生します。正しいです?それとも、タイムアウト制御を行う方が良いですか? それとも新スレ立てる?

あなたの意見をどうもありがとう

4

2 に答える 2

3

変更しても違いはありません。すべて UI スレッドで実行されています。plcdata()非ブロッキング呼び出しを行うには、別のスレッドでそれを起動する必要があります。

private static TextBox auxDataTextBox = new TextBox();

public static void goRead()
{            
    auxDataTextBox.TextChanged += new EventHandler(auxDataIncoming);
    Task.Factory.StartNew(() => { 
        return plcData(); 
    }).ContinueWith(task => {
        auxDataTextBox.Text = task.Result;
    }, null, TaskContinuationOptions.NotOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());
}


private static void auxDataIncoming(object sender, EventArgs e)
{      
    // Do something
}
于 2013-09-24T11:53:16.070 に答える
1

これにより、アプリケーションが凍結解除されることはありません。効果はまったく同じになります。これは、UI スレッドでまだ plcdata を実行しているためです。

設定したイベント構造全体がまったく意味をなしません。

マルチスレッドを検討する必要があります。これを行うための非常に簡単な方法は、BackgroundWorkerを使用することです。

于 2013-09-24T11:53:56.430 に答える