Передача параметра в делегат действия Task приводит к исключению - PullRequest
0 голосов
/ 10 октября 2011

Привет, я пытаюсь создать миниатюру, используя TPL с поведением Expression, но я ударил, пытаясь получить доступ к другому исключению потока в строке File.OpenRead (uriSource). Я пытаюсь передать параметр потока пользовательского интерфейса в поток фоновой задачи, который вызывает ошибку, я думаю ... как я могу решить эту проблему?

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

private BitmapSource RenderThumb(string uriSource)
    {

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

Ответы [ 3 ]

0 голосов
/ 10 октября 2011

Просто звонить TaskScheduler.FromCurrentSynchronizationConext() из любого места недостаточно.Убедитесь, что вызывающий поток является пользовательским интерфейсом и уже находится в диспетчере пользовательского интерфейса, когда этот код вызывается, т.е. обработчики событий Window_Load () / Button_Click () и т. Д. Являются лучшим местом для вызова этого кода.

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

Теперь вы можете предположить, что ICommand.Execute() должно быть в порядке, но они могут вызвать проблему, если сами команды были созданы в другом потоке, как фоновый рабочий.

0 голосов
/ 11 октября 2011

Я попробовал это, и это решило проблему, не уверенный, если это правильный способ сделать это ...

Task.Factory.StartNew((s) => RenderThumb(s as String), UriSource).ContinueWith((bs) =>
        {...}, TaskScheduler.FromSynchronizationContext());
0 голосов
/ 10 октября 2011

Возможно, проблема в доступе к UriSource, так как это свойство зависимости. Попробуйте это:

string uriSource = UriSource;

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