我正在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
循环中,在这种情况下,您可以忽略前面的注释,因为它实际上不再是寿命很长的单件。