2017-07-19 29 views
-2

我想在后台执行任务而不冻结主用户界面。但是,我在使用C#中的匿名函数Task.Run()时遇到了一些问题,因为它似乎不执行代码。我认为我的实施可能不正确。C#中的Task.Run()不执行某些部分

private List<string> GetPdfList 
{ 
    get 
    { 
     return File.Directory.GetFiles(PDF_FILE_DIRECTORY); 
    } 
} 

private void InitializePdf() 
{ 
    if (GetPdfList.Count > 0) 
    { 
     foreach (var pdf in GetPdfList) 
     { 
      var converter = new PdfConvertor(); 
      var format = ImageFormat.Png; 
      converter.Convert(pdf, TempFolder, format); 
     } 

    } 
} 


public MainForm() 
{ 
    InitializeComponent(); 
    Task.Run(() => 
    { 
     InitializePdf(); 
    }); 
} 

我认为这个问题是在的foreach范围

+1

设置断点并使用调试程序检查a)执行是否完全到达循环,以及b)列表是否包含元素。此外,构造函数可能不是创建线程的最佳位置。使用Load事件或(第一个)激活事件。 – dlatikay

+0

'可能'是特权问题,请尝试在主线程上运行'InitializePdf();'以确保它使用'Task.Run(...)'探测' – YukiNyaa

+0

它在主线程上运行时效果很好 –

回答

-6

Task.Run()创建任务,但不执行它。 为了做到你想做的事,你应该等待异步事件中的任务结果。 请参见Async loading for winforms

+3

这不是真正。 'Task.Run()'*确实*启动任务运行,因此名称。请注意,这里没有结果。 –