【问题标题】:C# task.Start() doesn't run the methodC# task.Start() 不运行该方法
【发布时间】:2018-08-01 10:56:32
【问题描述】:

我正在开发一个 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(() =&gt; Method()),Task.Factory.StartNew(() =&gt; Method()),,异步任务EnPost()并使用System.Timers.Timer。但无论我使用哪种方式,EnPost 方法都不会运行。我在方法中设置了断点。它没有击中那里。我是不是用错了任务?

【问题讨论】:

  • 它可能正在运行,只是没有停止。你处于无限循环中。没有休息或返回。
  • @Boxed 是的,我需要它不要停止。我每 0.5 秒读取一次串口
  • 但它是一个无限循环,所以永远不会到达等待。
  • @MarcGravell 对不起,它应该在循环中。我已经编辑了我的问题。
  • @BrianRudolph 这是一个错字。对不起。我已经编辑了我的问题。

标签: c# wpf task-parallel-library


【解决方案1】:

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

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

(由问题编辑修复)但是请注意,将线程池用于长期存在的任务不是一个好主意。您可能想改用完整线程。还;你的TaskDelay 可能想要在while 循环中,在这种情况下你可以忽略前面的评论,因为它实际上不再是一个非常长寿的单件。

【讨论】:

  • 您能稍微解释一下“捕获的变量”是什么吗?
  • 捕获问题可能会导致可能在某处被吞没的异常。如果列表有 6 个项目,我可以从 i &lt; 7 推断出 - 那么每次迭代都可能使用 i==7 执行,这将导致 IndexOutOfRangeException 异常。
  • @BrianRudolph 复制变量仍然不能解决问题。但是感谢您的提示,我尝试了一个 foreach 循环。终于成功了。
【解决方案2】:

感谢@Marc 和@Brian 的回答。他们提到了“捕获的变量”问题,所以我尝试了

foreach (Line l in Lines)
{ ... }

终于成功了。

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多