将参数传递给Task的Action委托结果异常

时间:2011-10-10 04:28:01

标签: c# wpf task-parallel-library

您好我正在尝试使用带有Expression的行为的TPL创建缩略图但我尝试在File.OpenRead(uriSource)行上访问另一个线程异常。我正在尝试将UI线程的参数传递给后台任务的线程,这会导致我认为错误...我该如何解决这个问题?

Task.Factory.StartNew(() => RenderThumb(UriSource)).ContinueWith((bs) =>
        {....}, TaskScheduler.FromCurrentSynchronizationConext());

private BitmapSource RenderThumb(string uriSource)
    {

        Stream imageStream = File.OpenRead(uriSource);
        ...
        return bitmapSource;
    }

3 个答案:

答案 0 :(得分:0)

问题在于访问UriSource,因为它是一个依赖属性。试试这个:

string uriSource = UriSource;

Task.Factory.StartNew(() => RenderThumb(uriSource )).ContinueWith((bs) =>
        {....}, TaskScheduler.FromCurrentSynchronizationConext());

答案 1 :(得分:0)

从任何地方呼叫TaskScheduler.FromCurrentSynchronizationConext()都是不够的。当调用此代码时,确保调用线程是UI并且已经在UI调度程序上,即Window_Load()/ Button_Click()等。事件处理程序是调用此代码的最佳位置。

Task.Factory.StartNew(() => RenderThumb(UriSource)).ContinueWith((bs) =>         {....}, TaskScheduler.FromCurrentSynchronizationConext()); 

现在您可能认为ICommand.Execute()应该没问题,但如果命令本身是在不同的线程上创建的,那么它们可能会导致问题,就像后台工作者一样。

答案 2 :(得分:0)

我尝试了这个并且它解决了问题,不确定这是否是正确的做法...

Task.Factory.StartNew((s) => RenderThumb(s as String), UriSource).ContinueWith((bs) =>
        {...}, TaskScheduler.FromSynchronizationContext());