C# BackgroundWorker:参数对象的子对象
我正在开发一个WPF应用程序,它在添加线程之前一直运行平稳。我想通过将其放入C# BackgroundWorker:参数对象的子对象,c#,wpf,multithreading,backgroundworker,C#,Wpf,Multithreading,Backgroundworker,我正在开发一个WPF应用程序,它在添加线程之前一直运行平稳。我想通过将其放入BackgroundWorker来简化保存/自动保存过程,以便在保存occours时不会阻塞我的UI 把我的应用程序想象成一个定制的photobook maker。 假设我的UI由几个图像对象组成。这些图像的源位于自定义的PhotobookImageObject中,因为每个选定的图像还包含其他元数据 PhotobookImageObject public class PhotobookImageObject {
BackgroundWorker
来简化保存/自动保存过程,以便在保存occours时不会阻塞我的UI
把我的应用程序想象成一个定制的photobook maker。
假设我的UI由几个图像对象组成。这些图像的源位于自定义的PhotobookImageObject
中,因为每个选定的图像还包含其他元数据
PhotobookImageObject
public class PhotobookImageObject
{
public BitmapSource source { get; set; }
public String unimportantMetadata{ get; set; }
}
当我想保存时,我想保存完整的照片簿。为简单起见:
相册
public class Photobook: INotifyPropertyChanged
{
public List<PhotobookImageObject> Photos{ get; set;}
public String otherMetaData { get; set;}
}
用于传输数据的自定义类:
public class BGObj
{
public Photobook bk { get; set; }
public String Loc { get; set; }
public bool not { get; set; }
}
以及BackgroundWorker
应该将类接收到自己线程中的实际部分:
private static void doWork(object sender, DoWorkEventArgs e)
{
BGObj received = e.Argument as BGObj;
Photobook book= received.bk;
String Location = received.Loc;
bool notAuto = received.not;
//this function can not Access the books.Photos.last().source for example.
SaveProjectToContainer(book, Location, notAuto);
}
我仍在接收系统。invalidooperationexception
当我尝试访问Photobook
中的photobookmageobject
列表中的BitmapSource
时
我的假设是:我正在创建的BGobj
只是引用了实际的相册,因此其成员的数据仍然停留在错误的线程中。我究竟如何确保我的对象的所有子成员都被传递到我想要处理它们的线程?还是我错了,还有别的什么
谢谢您的时间。由于没有人能帮我解决这个问题,我采用了Theodors的方法,并使用
Async/Await
切换到了更现代的方法
据我所知,这不是让操作在后台运行,而是在线程有空闲容量时仍然释放UI线程并运行wait
“tasks”inbetween。这允许我访问UI元素,并在自动保存时稍微停止应用程序的释放
如果有人需要一些提示如何解决这个问题,可以这样想:
public static void NotMain()
{
// queue following function. void Main for example would continue running after this.
await do_stuff_in_between(var object);
// Stuff after await will only happen if the function is done but UI is not blocked
Console.WriteLine("saving done");
}
public static async Task do_stuff_in_between(var object)
{
// do stuff with object or whatever you want.
}
当与
后台工作人员一起工作时
(顺便说一句,这在技术上已经过时,被Task.Run
和async/await所取代),您应该在事件处理程序中更新UI。您尝试过这种方法吗?我不会更新UI中的任何内容。我希望将所有必需的对象传递给backgroundWorker,然后我将序列化并将所有信息保存到文件中。在任何时候都不需要回调UI。确定。但您仍然需要返回to在允许访问BitmapSource
对象之前,UI线程。RunWorkerCompleted
事件在UI线程上运行,因此您可以利用它。
public static void NotMain()
{
// queue following function. void Main for example would continue running after this.
await do_stuff_in_between(var object);
// Stuff after await will only happen if the function is done but UI is not blocked
Console.WriteLine("saving done");
}
public static async Task do_stuff_in_between(var object)
{
// do stuff with object or whatever you want.
}