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)
{ ... }
终于成功了。
我正在做一个 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)
{ ... }
终于成功了。