0

私が達成しようとしていることを説明しましょう。私はC#でプログラミングしています。

関数 (メソッド) DoCalculations() があります。この DoCalculations() メソッドを再帰的に呼び出したいと思います。ただし、C# では未処理の例外 System.StackOverflow として例外が発生します。そのため、バック グラウンド スレッドで DoCalculations() メソッドを実行しようとしています。

FORM LOAD イベント時。私は次のことをしました: -

Thread objThread = new Thread(new ThreadStart(DoCalculations));

START BUTTON CLICK イベント時。私は次のようにスレッドを開始しています。

 objThread.IsBackground = true;
    objThread.Start();
    while (!objThread.IsAlive)
    {
    }

そして、上記のWhileループでDoCalculations()メソッドを連続して実行するつもりです。

DoCalculations()
{
//some calculations.

}

DoCalculations() メソッドで 1 回制御を取得します。しかし、私はこれをあらゆる瞬間にやりたいと思っています。

バックグラウンドスレッドに関して誰かが私を助けることができるか、または並列計算を行うためのより良い方法があればお願いします。

私はVB.NETで上記のアプローチを使用しましたが、C#.NETで機能しない理由をより混乱させました

任意の支援、コメントをいただければ幸いです。

ありがとうAP

4

5 に答える 5

3

まず、使いやすく高速なバックグラウンド ワーカーを使用します。

次に、ループ コードはバックグラウンド スレッドに移動する必要があります。

開始するためのコードを次に示します。

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerAsync();

...

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    while (someCondition)
    {
        DoCalculations();
    }
}

編集:スタックオーバーフローを修正しようとしているだけで、その方法がわからないようです。DoCalculations を再帰的に呼び出す代わりに、マルチスレッドを忘れて、ループ内で呼び出し、ループがいつ終了するかを認識していることを確認してください。また、この間に GUI をロックしたくない場合は、とにかくバックグラウンド スレッドを使用することをお勧めします。

于 2012-06-22T11:19:28.543 に答える
1

System.Threading.Timer 指定した間隔でメソッドを実行するメカニズムを提供します。

あなたの場合の使用方法....

using System.Threading;

タイマー コールバックとタイマー オブジェクトを次のように宣言します。

 private TimerCallback calculateTimerDelegate = null;
 private System.Threading.Timer calculationTimer = null;

そして、Load() イベントでそれらを初期化します。

calculateTimerDelegate = new TimerCallback(DoCalculation);
calculationTimer = new Timer(calculateTimerDelegate , null, 10000, (1 * 60 * 1000));

さて、あなたの計算方法は....

DoCalculations()
{
    //some calculations.
}
于 2012-06-22T11:17:35.737 に答える
0

スタックオーバーフローの例外が発生した場合、マルチスレッドを導入しても、それを解消する方法は見つかりません。再帰コードにバグがあります。

于 2012-06-22T11:15:24.370 に答える
0

System.Threading.Timerバックグラウンドスレッドで繰り返し実行する場合は、次のようなクラスを使用できます。

var timer = new Timer( DoCalculations, null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1));

これにより、毎秒計算が実行されます。時間を調整したい場合は、最後のTimeSpanパラメータを変更してください。

于 2012-06-22T10:54:04.100 に答える
0

BackgroundWorker クラスを使用する

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2012-06-22T11:05:57.340 に答える