クラス変数間で競合が発生すると!1つのクラスから同時に2つの関数を同時に実行するにはどうすればよいですか? C#
private myClass[] arrayms = new myClass[5];
foreach (myClass ms in arrayms) {
if (ms.ScheduleState)
Task.Factory.StartNew(() => ms.Start());
}
クラス変数間で競合が発生すると!1つのクラスから同時に2つの関数を同時に実行するにはどうすればよいですか? C#
private myClass[] arrayms = new myClass[5];
foreach (myClass ms in arrayms) {
if (ms.ScheduleState)
Task.Factory.StartNew(() => ms.Start());
}
私は、テキストの要約を持って、クラスはオブジェクトです。プログラムにはエラーはありませんが、実行時には競合変数のみがあります。 -
「競合変数」はわかりません。しかし、残りは私の前のコメントで説明したものに合うようです。 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());
エンド編集
myclassクラスからstarttask関数を何度か実行すると、私のクラス変数が妨害されます。 –
'Task.Factory.StartNew(..)は何をしますか?その名前「StartNew」は、新しいオブジェクトが作成されて開始されることを意味します。しかし、既存のオブジェクトを開始する匿名メソッドが渡されます。実際にここで2つのことを開始していますか? – radarbob
どのように私はからいくつか実行することができます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;
}
.
.
.
}
}
を引き起こすログインするとC#の あなたはエラー何を取得しているのですか?また、5つの "スロット"を持つ配列を作成しますが、 'foreach'を呼び出す前にオブジェクトを置かないように見えます。したがって、 'foreach'は' arrayms'が空であるために単に落ちます。 – radarbob
私はテキストの要約を得ました、クラスはオブジェクトです。プログラムにはエラーはありませんが、実行時には競合変数のみがあります。 –
私の言語でお詫び申し上げます) –