2016-08-20 3 views
-4

クラス変数間で競合が発生すると!1つのクラスから同時に2つの関数を同時に実行するにはどうすればよいですか? C#

private myClass[] arrayms = new myClass[5]; 

foreach (myClass ms in arrayms) { 
    if (ms.ScheduleState) 
    Task.Factory.StartNew(() => ms.Start()); 
} 
+0

を引き起こすログインするとC#の あなたはエラー何を取得しているのですか?また、5つの "スロット"を持つ配列を作成しますが、 'foreach'を呼び出す前にオブジェクトを置かないように見えます。したがって、 'foreach'は' arrayms'が空であるために単に落ちます。 – radarbob

+0

私はテキストの要約を得ました、クラスはオブジェクトです。プログラムにはエラーはありませんが、実行時には競合変数のみがあります。 –

+0

私の言語でお詫び申し上げます) –

答えて

0

私は、テキストの要約を持って、クラスはオブジェクトです。プログラムにはエラーはありませんが、実行時には競合変数のみがあります。 -

「競合変数」はわかりません。しかし、残りは私の前のコメントで説明したものに合うようです。 foreachを呼び出すとき、配列は空です。そのため、おそらくこの:

for (int i=0; i < ms.Length; i++) { 
    arrayms[i] = new MyClass(); 
} 

// ScheduleState must somehow get set, then: 

foreach (myClass ms in arrayms) { 
    if (ms.ScheduleState) 
    Task.Factory.StartNew(() => ms.Start()); 
} 

編集

Task.Factory.StartNewは(..)何をするのでしょうか? StartNewという名前は、新しいオブジェクトが作成され、開始されたことを意味します。しかし、既存のオブジェクトを開始する匿名メソッドが渡されます。実際にここで2つのことを開始していますか?

この(下記のコメントが、)問題でない場合はループ内でLINQを呼び出したときに多分それはinfamous scope problemです:

foreach (myClass ms in arrayms) { 
    MyClass workAround = ms; // must set "ms" to a loop-scoped variable. 
          // why? the answer is TL;DR 

    if (workAround.ScheduleState) 
    Task.Factory.StartNew(() => workAround.Start()); 

エンド編集

+0

myclassクラスからstarttask関数を何度か実行すると、私のクラス変数が妨害されます。 –

+0

'Task.Factory.StartNew(..)は何をしますか?その名前「StartNew」は、新しいオブジェクトが作成されて開始されることを意味します。しかし、既存のオブジェクトを開始する匿名メソッドが渡されます。実際にここで2つのことを開始していますか? – radarbob

0

どのように私はからいくつか実行することができます1つのクラスから同時に関数ですか? MyClassの変数間の_StartTask()競合を実行し、厄介

private myClass[] arrayms = new myClass[5]; 
public void _TasksClassCreator() 
{ 
    foreach (var ms in arrayms) 
    { 
      ms.ScheduleName = SName; 
      . 
      . 
      . 
    } 
} 
public void _StartTask() 
{ 
    foreach (myClass ms in arrayms) 
    { 
     if (ms.ScheduleState) 
     Task.Factory.StartNew(() => ms.Start()); 
    } 
} 

public sealed class myClass 
{ 
    public void Start() 
    { 
     _TBTask(); 
    } 
    private void _TBTask() 
    { 
     while(true) 
     { 
       ...//Conflict here 
       // this function always running and reporting result... 
       //log here 
     } 
    } 

    private string _ScheduleName; 

    public string ScheduleName 
    { 
     get 
     { 
      return _ScheduleName; 
     } 
     set 
     { 
      _ScheduleName = value; 
     } 
     . 
     . 
     . 
    } 
} 
関連する問題