C# 即使在添加Dispatcher.Invoke之后,调用线程也无法访问此对象
调用线程无法访问此对象,因为即使在添加了C# 即使在添加Dispatcher.Invoke之后,调用线程也无法访问此对象,c#,wpf,thread-safety,C#,Wpf,Thread Safety,调用线程无法访问此对象,因为即使在添加了Dispatcher.Invoke之后,另一个线程也拥有它 async Task capturePredict() { await Dispatcher.Invoke( async () => { PngBitmapEncoder image = new PngBitmapEncoder(); image.Frames.Add(BitmapFrame.Create(bitmap));
Dispatcher.Invoke
之后,另一个线程也拥有它
async Task capturePredict()
{
await Dispatcher.Invoke( async () =>
{
PngBitmapEncoder image = new PngBitmapEncoder();
image.Frames.Add(BitmapFrame.Create(bitmap));
using (Stream stream = File.Create(@"E:\ImageClassificationTraining\image.png"))
{
await Task.Run(() => image.Save(stream));
}
});
}
即使添加了Dispatcher.Invoke
,问题仍然没有改变
async Task capturePredict()
{
await Dispatcher.Invoke( async () =>
{
PngBitmapEncoder image = new PngBitmapEncoder();
image.Frames.Add(BitmapFrame.Create(bitmap));
using (Stream stream = File.Create(@"E:\ImageClassificationTraining\image.png"))
{
await Task.Run(() => image.Save(stream));
}
});
}
与解码BitmapSource(可以冻结以使其跨线程访问)不同,编码似乎不能在UI线程以外的线程中完成 但是,您可以通过以下方式将编码步骤与写入文件分开:
public async Task SaveImageAsync(BitmapSource bitmap, string path)
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var memoryStream = new MemoryStream())
{
encoder.Save(memoryStream);
memoryStream.Position = 0;
using (var fileStream = File.Create(path))
{
await memoryStream.CopyToAsync(fileStream);
}
}
}
您正在使用
Dispatcher.Invoke
,但随后掉头调用Task.Run
,这会让您回到线程池中,不再在Dispatcher线程上运行。哪一行引发异常?@TheodorZoulias这一行等待任务。Run(()=>image.Save(stream))
@Damien_The_unsiever我对另一个方法使用相同的方法,它可以工作公共异步任务SendMsg(){wait this.Dispatcher.Invoke(async()=>{npesan=predictedLabel.Content.ToString();wait Task.Run(()=>RMQ.SendMessage(tujuan,npesan));predictedLabel.Content=”“;});}
@Theodor这是不正确的。无法从创建DispatcherObject的线程以外的线程访问该DispatcherObject。这不一定是UI线程。但是,在任务操作中创建编码器在这里没有帮助,因为它本身仍然需要访问源位图。