您好我正在尝试使用带有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;
}
答案 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());