C# task.Start() 没有 运行 方法

C# task.Start() doesn't run the method

我正在做一个 WPF-MVVM 项目,我需要在一些后台线程中实现异步无限循环。我在 ViewModel 中所做的是

 public TestVM()
 {
    LineIO_Task();
    //some other work
 }

和 LineIO_Task 定义为

public void LineIO_Task()
{
    for (int i = 0; i < 7; i++)
    {
         Task GetP = new Task(() => { EnPost(Lines[i]); }, TaskCreationOptions.LongRunning);
         GetP.Start();

    }
}

Lines 是在 TestVm 中初始化的 ObservableCollection。 EnPost 定义为

public async void EnPost(Line l)
{           
    int last = 0;               
    while (true)
    {
        // do the work in the loop
        int pno = l.Com.ReadPostNo();//read a serial port
        if (pno != 0 && pno != last)
        {
            log.WriteLog(pno + " to " + l.ToString());
            Dispatcher.Invoke(() =>
            {   
                // update the UI                     
                l.Posts.First(x => x.IsValid).Num = pno;
                l.Posts.First(x => x.IsValid).IsValid = false;
                LocalDb.InsertPost(l.Num, AssignedPost.ToList().Find(x => x.Num == pno));                            
            });
            pno = last;
        } 
        await Task.Delay(500);                   
    }        
}

我已经尝试了 Task.Run(() => Method())Task.Factory.StartNew(() => Method())、async Task EnPost() 并使用了 System.Timers.Timer。但是无论我用哪种方式,EnPost方法就是不运行。我在方法中设置了断点。它没有击中那里。我使用任务有误吗?

我猜这是一个 "captured variable" 问题;尝试:

for (int i = 0; i < 7; i++)
{
     int index = i;
     Task GetP = new Task(() => { EnPost(Lines[index]); }, TaskCreationOptions.LongRunning);
     GetP.Start();
}

(由问题编辑修复)但是请注意,将线程池用于长期任务不是一个好主意。您可能想改用完整的线程。还;你的 TaskDelay 可能想要 inside while 循环,在这种情况下你可以忽略之前的评论,因为它实际上不再是一个非常长寿的单曲片.

感谢@Marc 和@Brian 的回答。他们提到了 "captured variable" 问题,所以我尝试了

foreach (Line l in Lines)
{ ... }

终于成功了。