我正在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()) 、,异步Task EnPost()并使用System.Timers.Timer。但是,无论我使用哪种方式,EnPost方法都不会运行。我在方法中设置了断点。它没有打到那里。我使用Task是否错误?

最佳答案

我猜这是一个“捕获变量”问题;尝试:

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


(由问题编辑修复)但是请注意,将线程池用于寿命很长的任务不是一个好主意。您可能要使用完整线程。也;您的TaskDelay可能希望位于while循环中,在这种情况下,您可以忽略前面的注释,因为它实际上不再是寿命很长的单件。

07-24 14:09