1

シリアルポート通信アプリケーションを開発しています。クラスを書きました。シリアル ポートのDataReceivedイベントでは、いくつかの文字列操作を行うメソッドを呼び出す必要があります。これらの操作を別のスレッドで行いたい。

しかし、私のアプリケーションはアプリケーションからのウィンドウではないため(クラスのみです)Invoke()、.

では、そうでないクラスでメソッドを呼び出すにはどうすればよいInvoke()でしょうか?

ありがとう

4

5 に答える 5

4

メソッドを非同期で呼び出したいということを正しく理解していますか? もしそうなら:

Thread.QueueUserWorkItem(myCallBack)

デリゲートはmyCallBackを食べてobject戻ってきvoidます。簡単な例さえあるMSDNを参照してください。

于 2009-12-15T20:17:38.540 に答える
2

UI を扱っていないためInvoke、同期に使用する必要はありません。を使用して新しいスレッドを生成するThreadPoolBackgroundWorker、新しいThread. そのスレッドから、他のスレッドからもアクセスされる可能性のあるデータにアクセスする場合は、何らかの同期メカニズム (または同様のもの)を適用する必要があります。lock

簡単な例:

// code in your class that reads data from serial port
string data = GetDataFromSerialPort();
ThreadPool.QueueUserWorkItem(DoSomeProcessing, data);    

private static void DoSomeProcessing(object state)
{
    string data = state.ToString();
    // process data
}
于 2009-12-15T20:20:56.690 に答える
0

クラスを使用System.Threading.Threadし、デリゲートを介してメソッドを渡します。

編集

public class MyClass
{
    var t1 = new Thread(new ThreadStart(mymethod));

    public void MyMethod() { }
    public void ExecuteMyThread() => t1.Start();
}
public class MainClass
{
    var myClass = new MyClass();
    public void Foo() => myClass.ExecuteMyThread(); // Start thread from other class
}
于 2009-12-15T20:17:33.767 に答える
0

自分で新しいスレッドを作成して実行できます。

Thread thread = new Thread(MyBackgroundMethod);

thread.Start();

...

public void MyBackgroundMethod()
{
 ...
}
于 2009-12-15T20:19:57.410 に答える
0

最も簡単な方法は、名前空間 System.ComponentModel.BackgroundWorker にある BackgroundWorker を使用することです。これにより、バックグラウンド スレッドでの非同期操作の管理が容易になり、ハンドラーを追加して、ワーカー スレッドの完了後にキャンセル、進行状況の監視、および応答を行うことができます。MSDNリンクテキストのリンクは次のとおりです

于 2009-12-15T20:36:05.490 に答える