1

いくつかの画像を選択し、メイン スレッドで bitmapimage に読み込みます。別のスレッド (BackgroundWorker) でそれらを sqlserver データベースに保存したいのですが、次のエラーが発生します。

別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。

注意 : 対象フィールドの DataType は varbinary(max) です

サンプルコード:

class Class1
    {
        private List<BitmapSource> Items;
        public Class1()
        {
            this.Items = new List<BitmapSource>();
        }
        public void AddItem(BitmapSource bs)
        {
            this.Items.Add(bs);
        }
        public void Save()
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += bw_DoWork;
            bw.RunWorkerCompleted += bw_RunWorkerCompleted;
            bw.RunWorkerAsync(this.Items);
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            throw new NotImplementedException();
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            MyBLL bl = new MyBLL();
            bl.Save(e.Argument as List<BitmapSource>);
        }

    }

public class MyBLL
    {

        public byte[] ConvertBitmapSourceToByteArray(BitmapSource BS)
        {
            if (BS == null)
            {
                return new byte[] { };
            }
            using (MemoryStream ms = new MemoryStream())
            {
                JpegBitmapEncoder jbe = new JpegBitmapEncoder();

                jbe.Frames.Add(BitmapFrame.Create(BS.Clone()));
                jbe.Save(ms);
                return ms.GetBuffer();
            }
        }

        public void Save(List<BitmapSource> _items)
        {
            foreach (BitmapSource item in _items)
            {
                ---  insert  ConvertBitmapSourceToByteArray(item) to DataBase   ---
            }
        }

    }
4

3 に答える 3

2

おそらく AddItem で、他のスレッドからアクセスできるようにするには、BitmapSource をFreezeする必要があります。

public void AddItem(BitmapSource bs)
{
    bs.Freeze();
    this.Items.Add(bs);
}

BitmapFrame.Create を呼び出す前に BitmapSource を複製する必要がないことにも注意してください。

jbe.Frames.Add(BitmapFrame.Create(BS));
于 2013-05-07T09:41:41.440 に答える
0

BitmapSourceUIスレッドで作成され、別のスレッドを介してアクセスしようとしているため、エラーが発生しています。これを回避するには、BitmapSourceバイトに変換するメソッドを、依存しない別のメソッドに変更するBitmapSourceか、UI スレッドでバイトに変換する必要があります。

于 2013-05-07T06:01:53.733 に答える
0
        BackgroundWorker worker = new BackgroundWorker();
        Image yourImg = new Bitmap(1,1);
        worker.DoWork += new DoWorkEventHandler((o,arg)=>{
            Image img = arg.Argument as Image;
            //Do whatever you want with your image
        });            
        worker.RunWorkerAsync(yourImg);//pass your image as a parameter to your sub-thread
于 2013-05-07T05:14:50.880 に答える