Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 即使在添加Dispatcher.Invoke之后,调用线程也无法访问此对象_C#_Wpf_Thread Safety - Fatal编程技术网

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线程。但是,在任务操作中创建编码器在这里没有帮助,因为它本身仍然需要访问源位图。