2

私はこの行を動作させるようにしようとしていBackgroundWorkerます:

map = Map.LoadMap(mapname);

…このような:

bw.DoWork += (map = Map.LoadMap(mapname));

エラーが発生しますCannot implicitly convert type 'game.Map' to 'System.ComponentModel.DoWorkEventHandler'

ゲームのスレッドコンポーネントとして使い始めたばかりですがBackgroundWorker、既存のすべてのメソッドを変換して使用するのは簡単ではないようです。これを機能させる簡単な方法はありますか、それとも他のスレッドメカニズムに切り替える方が良いですか?

注:スレッドベースから、進行状況のパーセンテージをポーリングできる必要があり、既存のメソッド呼び出しを台無しにしないようにする必要があります。

4

5 に答える 5

2

次のような匿名の代理人を活用できます。

bw.DoWork += (sender, args) => { map = Map.LoadMap(mapname); };
于 2012-08-13T14:59:05.337 に答える
1

私が理解しているように、変数mapのタイプとメソッドMap.LoadMapの戻りタイプはgame.Mapです。あなたのコードの行

bw.DoWork += (map = Map.LoadMap(mapname));

次に行うこと:Map.LoadMap(mapname)から結果を取得し、それを変数mapに設定してから、この値をDoWorkイベントのハンドラーとして使用してみてください。また、変数マップのタイプとプロパティbw.DoWorkは異なります。

したがって、この行を次のように変更する必要があります。

bw.DoWork += (sender, eventArgs) => { map = Map.LoadMap(mapname); }

これは、新しいデリゲート "(sender、eventArgs)=> ..."を作成し、それをプロパティbw.DoWorkのハンドラーとして使用しようとしていることを意味します。

于 2012-08-13T15:03:34.067 に答える
1

オプション WorkerReportsProgress = true を使用できるため、Backgroundworker は優れています。これは、パーセンテージのプールに使用できます。

このように DoWork メソッド内で進行状況を報告できます

bw.ReportProgress(percentage);

私は、スレッドが行うことのラッパーとして BackgroundWorker を関連付けていました。そのため、GUI の作業には BackgroundWorker を使用し、より特殊なジョブまたはダーティなジョブ (Windows サービスなど) には Threads を使用します。

dowork メソッドは次のように記述する必要があります

bw.DoWork += (sender, args) => { map = Map.LoadMap(mapname); };
于 2012-08-13T14:58:32.283 に答える
0

次のようにBackgroundWorkerを使用できます。

        var worker = new System.ComponentModel.BackgroundWorker();
        worker.DoWork += delegate 
        { 
             map = Map.LoadMap(mapname); 
        };
        worker.RunWorkerAsync();

プログラムはRunWorkerAsync()メソッドの直後に実行を継続するため、後でmap変数を使用すると、ロードされたマップではない可能性があることに注意してください。

マップがロードされた後に実行を続行するには、RunWorkerCompletedにもサブスクライブする必要があります。

        var worker = new System.ComponentModel.BackgroundWorker();
        worker.DoWork += delegate 
        { 
            map = Map.LoadMap(mapname); 
        };
        worker.RunWorkerCompleted += delegate 
        { 
            MapComplete(); // contiune with stuff here
        };
        worker.RunWorkerAsync();
于 2012-08-13T15:20:17.890 に答える
0

+ =演算子は、イベントハンドラーをアタッチしていることを示します(DoWorkはイベントです)。

使用例は次のとおりです。

backgroundworkerのインスタンスを作成し(この場合はクラスレベルになります)、イベントSetupBackgroundWorker()をアタッチする関数を呼び出します。

private BackgroundWorker bw = new BackgroundWorker();

private void SetupBackgroundWorker()
{
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    bw.ReportProgress = true;
}

これらはサンプルのイベントハンドラーであり、アイデアを提供する必要があります

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{//Just as an example, I don't ever call the functions to trigger this event
    int ProgressPercent = e.ProgressPercentage;
    object AnyOtherDataReported = e.UserState;
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   //Do something when the work has been completed
   //Note: You should always check e.Cancelled and e.Error before attempting to touch the e.Result. I did not put that protection in this example.

   object TheResultFrom_DoWork = e.Result;//This is your "map" object
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
  //object PassedInObject=e.Argument; //This is the argument you sent to RunWorkerAsync

    //Type cast PassedInObject to your correct Type
    WhateverTypeItIs_YouDidntSay mapname=(WhateverTypeItIs_YouDidntSay)e.Argument

    //Perform your task
    object returnvalue=Map.LoadMap(mapname);//This was your varriable called "map"

    //Assign the result of your task to the return value
    e.Result=returnvalue;
}

この関数にmapnameの値を渡します。バックグラウンドワーカーが前のタスクを実行するのに忙しくない場合は、プロセスを開始する必要があります。

private void ProcessTheMap_InBackground(WhateverTypeItIs_YouDidntSay mapname)
{
    if (!bw.IsBusy)
    {
        bw.RunWorkerAsync(mapname);
    }
    else
    {//You are already loading something in the background
    }
}
于 2012-08-13T15:21:30.387 に答える