我正在处理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())
、,异步任务EnPost()并使用了System.Timers.Timer
。但是,无论我使用哪种方式,EnPost方法都不会运行。我在方法中设置了断点。它没有打到那里。我使用Task错误吗?
答案 0 :(得分:3)
我猜这是一个“捕获变量”问题;尝试:
Intent intent = new Intent();
intent.setType("application/pdf");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
(由问题编辑修复)但是请注意,将线程池用于寿命很长的任务不是一个好主意。您可能要使用完整线程。也;您的for (int i = 0; i < 7; i++)
{
int index = i;
Task GetP = new Task(() => { EnPost(Lines[index]); }, TaskCreationOptions.LongRunning);
GetP.Start();
}
可能希望位于TaskDelay
循环内,在这种情况下,您可以忽略前面的注释,因为它实际上不再是寿命很长的单件。 / strike>
答案 1 :(得分:0)
感谢@Marc和@Brian的回答。他们提到了“捕获变量”问题,所以我尝试了
C:\Users...\Downloads>pscp -i "DEV_IRM.ppk" product-sp-4.2.0-rc2.tar.gz prvclouduser@10.149.139.26:/home/prvclouduser/sp420
终于可以了。