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

时间:2018-07-31 15:18:21

标签: c# wpf task-parallel-library

我正在处理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错误吗?

2 个答案:

答案 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

终于可以了。