我如何给 Dispatcher.Invoke 一个参数?
How can I give an argument to Dispatcher.Invoke?
我正在尝试在后台线程中加载 BitmapImage,然后将 (WPF) 图像源设置为此 BitmapImage。
我目前正在尝试这样的事情:
public void LoadPicture()
{
Uri filePath = new Uri(Directory.GetCurrentDirectory() + "/" + picture.PictureCacheLocation);
if (Visible && !loaded)
{
if (File.Exists(filePath.AbsolutePath) && picture.DownloadComplete)
{
BitmapImage bitmapImage = LoadImage(filePath.AbsolutePath);
image.Dispatcher.Invoke(new Action<BitmapImage>((btm) => image.Source = btm), bitmapImage);
loaded = true;
}
}
}
但是我得到一个 InvalidOperationException 因为后台线程拥有 BitmapImage。
有没有办法将 BitmapImage 的所有权或副本提供给 UI 线程?
我需要在后台线程中加载位图图像,因为它可能会阻塞很长时间。
所有与 DependencyObject 的工作都应该在一个线程中进行。
除了 Freezable 的冻结实例。
将参数传递给 Invoke 也毫无意义(在这种情况下)——最好使用 lambda。
还有Dispatcher自锁的危险,因为你没有检查流量。
public void LoadPicture()
{
Uri filePath = new Uri(Directory.GetCurrentDirectory() + "/" + picture.PictureCacheLocation);
if (Visible && !loaded)
{
if (File.Exists(filePath.AbsolutePath) && picture.DownloadComplete)
{
BitmapImage bitmapImage = LoadImage(filePath.AbsolutePath);
bitmapImage.Freeze();
if (image.Dispatcher.CheckAccess())
image.Source = bitmapImage;
else
image.Dispatcher.Invoke(new Action(() => image.Source = bitmapImage));
loaded = true;
}
}
}
Freezable 类型的对象并不总是允许自己被冻结。
但是您的代码不足以识别可能存在的问题。
如果冻结失败,再说明LoadImage(Uri)方法是如何实现的。
我正在尝试在后台线程中加载 BitmapImage,然后将 (WPF) 图像源设置为此 BitmapImage。
我目前正在尝试这样的事情:
public void LoadPicture()
{
Uri filePath = new Uri(Directory.GetCurrentDirectory() + "/" + picture.PictureCacheLocation);
if (Visible && !loaded)
{
if (File.Exists(filePath.AbsolutePath) && picture.DownloadComplete)
{
BitmapImage bitmapImage = LoadImage(filePath.AbsolutePath);
image.Dispatcher.Invoke(new Action<BitmapImage>((btm) => image.Source = btm), bitmapImage);
loaded = true;
}
}
}
但是我得到一个 InvalidOperationException 因为后台线程拥有 BitmapImage。 有没有办法将 BitmapImage 的所有权或副本提供给 UI 线程?
我需要在后台线程中加载位图图像,因为它可能会阻塞很长时间。
所有与 DependencyObject 的工作都应该在一个线程中进行。
除了 Freezable 的冻结实例。
将参数传递给 Invoke 也毫无意义(在这种情况下)——最好使用 lambda。
还有Dispatcher自锁的危险,因为你没有检查流量。
public void LoadPicture()
{
Uri filePath = new Uri(Directory.GetCurrentDirectory() + "/" + picture.PictureCacheLocation);
if (Visible && !loaded)
{
if (File.Exists(filePath.AbsolutePath) && picture.DownloadComplete)
{
BitmapImage bitmapImage = LoadImage(filePath.AbsolutePath);
bitmapImage.Freeze();
if (image.Dispatcher.CheckAccess())
image.Source = bitmapImage;
else
image.Dispatcher.Invoke(new Action(() => image.Source = bitmapImage));
loaded = true;
}
}
}
Freezable 类型的对象并不总是允许自己被冻结。
但是您的代码不足以识别可能存在的问题。
如果冻结失败,再说明LoadImage(Uri)方法是如何实现的。