.net - await in WPF doesn't return to UI Thread -
i have strange behavior in wpf 4.5 (.net 4.5). i'm using keywords await , async in order run long-operations (for example load big bitmapimage, base image control). problem awaiter doesn't return main ui thread, because teh famous exception:
the calling thread cannot access object because different thread owns it.
could me?
here code:
event handler of button:
private void getexifdata_click(object sender, routedeventargs e) { // async method (new analyzesingleimage()).runexif(this); }
the main method (in separate class, same assembly)
public async void runexif(mainwindow win) { // here run correctly code on main ui thread .. .. // async !!! bitmapimage bi = await loadimageasync(filename); image img = new image(); img.source = bi; // *********** here exception ************* .. .. }
the async method:
private task<bitmapimage> loadimageasync(string filename) { return task<bitmapimage>.run(() => loadimage(filename)); }
the long time method:
private bitmapimage loadimage(string filename) { bitmapimage bi = new bitmapimage(); bi.begininit(); bi.urisource = new uri(filename); bi.cacheoption = bitmapcacheoption.onload; bi.endinit(); return bi; }
someone me please?
loadimage
runs on thread-pool because pushed there using task.run
. valid use ui elements on different threads must access them on same thread consistently.
the bitmapimage
created bound thread-pool thread. cannot combined main ui.
for reason, best practice have ui on single thread. create bitmap on main thread.
if remember wpf correctly creating bitmapimage
quick , loading image async anyway.
Comments
Post a Comment