2

私のコードには、次の関数があります。

void OnEvent(....){ SaveData();}

SaveDataは次のようになります。

void SaveData()
{
    new Thread(
        ()=>
        {
            lock(data)
            {
                Serialize(data);
            }
        }).Start();
}

私の問題は、シリアル化のプロセス中にイベントが数回発生する可能性があり、最初のシリアル化プロセスが終了した後、シリアル化を1回だけ実行したいということです。

これを行うための最良の方法は何ですか?

4

1 に答える 1

3

対処しなければならない問題がいくつかあります。

Threadまず、クラスを使用しないでください。本当。並列処理用のフレームワークを作成している場合を除き、Thread. System.Threading.Tasks.Taskまたは (4.0 より前のバージョンの .NET を使用している場合) のようなものを使用してSystem.Threading.ThreadPool、コードの非同期実行をスケジュールします。

data第二に、スレッド間などでインスタンス変数を共有することはスティッキーであることを認識しておく必要があります。競合や競合状態の問題が発生しないように、保存するデータを非同期関数に渡す方がはるかに優れています。

第三に、これが実行の順序である場合、あなたは何をしたいですか:

<things happen>
OnEvent fires
<things happen>
Serialize starts
OnEventFires
Serialize completes

OnEventの途中で発生するため、完全Serializeに無視する必要がありますか、それとも別のシリアル化をスケジュールする必要がありますか? ここで「b」と答えた場合、ここではどうすればよいですか?

<things happen>
OnEvent fires
<things happen>
Serialize starts
OnEvent fires
<things happen>
OnEvent fires
Serialize completes

2 つの通話をSerializeスケジュールする必要がありますか、それとも 1 つだけですか?

于 2012-04-26T20:56:16.500 に答える