シリアルポート通信アプリケーションを開発しています。クラスを書きました。シリアル ポートのDataReceived
イベントでは、いくつかの文字列操作を行うメソッドを呼び出す必要があります。これらの操作を別のスレッドで行いたい。
しかし、私のアプリケーションはアプリケーションからのウィンドウではないため(クラスのみです)Invoke()
、.
では、そうでないクラスでメソッドを呼び出すにはどうすればよいInvoke()
でしょうか?
ありがとう
シリアルポート通信アプリケーションを開発しています。クラスを書きました。シリアル ポートのDataReceived
イベントでは、いくつかの文字列操作を行うメソッドを呼び出す必要があります。これらの操作を別のスレッドで行いたい。
しかし、私のアプリケーションはアプリケーションからのウィンドウではないため(クラスのみです)Invoke()
、.
では、そうでないクラスでメソッドを呼び出すにはどうすればよいInvoke()
でしょうか?
ありがとう
メソッドを非同期で呼び出したいということを正しく理解していますか? もしそうなら:
Thread.QueueUserWorkItem(myCallBack)
デリゲートはmyCallBack
を食べてobject
戻ってきvoid
ます。簡単な例さえあるMSDNを参照してください。
UI を扱っていないためInvoke
、同期に使用する必要はありません。を使用して新しいスレッドを生成するThreadPool
かBackgroundWorker
、新しい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
}
クラスを使用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
}
自分で新しいスレッドを作成して実行できます。
Thread thread = new Thread(MyBackgroundMethod);
thread.Start();
...
public void MyBackgroundMethod()
{
...
}
最も簡単な方法は、名前空間 System.ComponentModel.BackgroundWorker にある BackgroundWorker を使用することです。これにより、バックグラウンド スレッドでの非同期操作の管理が容易になり、ハンドラーを追加して、ワーカー スレッドの完了後にキャンセル、進行状況の監視、および応答を行うことができます。MSDNリンクテキストのリンクは次のとおりです