1

メインスレッドから別のスレッドで継続的に実行されているメソッドにデータを渡すにはどうすればよいですか? 値が連続的にインクリメントされるタイマーがあり、そのデータは各タイマーティックイベントで別のスレッドのメソッドに渡されます。助けてください。スレッドについての知識はあまりありません。

4

2 に答える 2

0

Windows フォームを使用している場合は、次のようなことができます。

フォームにプロパティを追加します

private readonly System.Threading.SynchronizationContext context;
public System.Threading.SynchronizationContext Context
{
    get{ return this.context;}
}

あなたのフォームコンストラクターでプロパティを設定します

this.context= WindowsFormsSynchronizationContext.Current;

このプロパティを使用して、コンストラクター パラメーターとしてバックグラウンド ワーカーに渡します。このようにして、ワーカーはGUI コンテキストについて知ることができます。バックグラウンド worker内に同様のプロパティを作成します。

private readonly System.Threading.SynchronizationContext context;
public System.Threading.SynchronizationContext Context
{
    get{ return this.context;}
}

public MyWorker(SynchronizationContext context)
{
    this.context = context;
}

Done() メソッドを変更します。

void Done()
{
    this.Context.Post(new SendOrPostCallback(DoneSynchronized), null);
}

void DoneSynchronized(object state)
{
    //place here code You now have in Done method.
}

DoneSynchronized では、常に GUI スレッドにいる必要があります。

上記の答えはまさにこのスレッドからのものです。重複マークあり。

重複の可能性

于 2013-09-30T10:00:07.303 に答える
0

キューを使用して、アクセスのためにロックする他のスレッドにデータを送信できます。これにより、他のスレッドに送信されたすべてのデータが最終的に処理されることが保証されます。他のスレッドにデータを「送信」していると考える必要はありませんが、共有データのロックを管理して、同時にアクセスしないようにします (これは災害を引き起こす可能性があります!)。

Queue<Data> _dataQueue = new Queue<Data>();

void OnTimer()
{
    //queue data for the other thread
    lock (_dataQueue)
    {
        _dataQueue.Enqueue(new Data());
    }
}

void ThreadMethod()
{
    while (_threadActive)
    {
        Data data=null;
        //if there is data from the other thread
        //remove it from the queue for processing
        lock (_dataQueue)
        {
            if (_dataQueue.Count > 0)
                data = _dataQueue.Dequeue();
        }

        //doing the processing after the lock is important if the processing takes
        //some time, otherwise the main thread will be blocked when trying to add
        //new data
        if (data != null)
            ProcessData(data);

        //don't delay if there is more data to process
        lock (_dataQueue)
        {
            if (_dataQueue.Count > 0)
                continue;
        }
        Thread.Sleep(100);
    }
}
于 2013-09-30T09:56:05.647 に答える