2016-08-20 67 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; 
     } 
     . 
     . 
     . 
    } 
}