2016-08-20 64 views
-4

當類變量之間運行衝突!如何從一個類同時運行兩個函數? C#

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

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

什麼是錯誤您收到?另外,你創建一個有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意味着一個新的對象被創建並開始。但是傳遞一個啓動一個現有對象的匿名方法。那麼我們是否真的在這裏開始兩件事?

如果這個(評論,下同)是沒有問題的話,也許它的infamous scope problem在循環中調用LINQ時:

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'意味着一個新的對象被創建和啓動。但是傳遞一個啓動一個現有對象的匿名方法。那麼我們是否真的在這裏開始兩件事? – radarbob

0

我怎樣才能運行從多個同一時間從一個班的功能? C# 當運行_StartTask()衝突MyClass的變量之間和日誌導致凌亂

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; 
     } 
     . 
     . 
     . 
    } 
}