Загрузка изображения из базы данных с асинхронным - PullRequest
0 голосов
/ 18 января 2019

Что у меня есть в классе

  public async Task<BitmapImage> GetBitmap(string ConnectingString, string SQLCode)
    {
        SqlConnection con1 = new SqlConnection(ConnectingString);

        //Open Connection String
        con1.Open();

        // load image from the database 
        SqlCommand Commandcmd = new SqlCommand(SQLCode, con1);
        Task<BitmapImage> t = Task.Run(() =>
        {
            BitmapImage myBitmapImage = new BitmapImage();


            SqlDataReader rdr1 = null;
            rdr1 = Commandcmd.ExecuteReader();


            while (rdr1.Read())
            {
                if (rdr1 != null)
                {
                    if (rdr1[0] != DBNull.Value)
                    {
                        byte[] data = (byte[])rdr1[0]; // 0 is okay if you only selecting one column

                        using (System.IO.MemoryStream ms = new System.IO.MemoryStream(data))
                        {

                            // BitmapImage.UriSource must be in a BeginInit/EndInit block
                            myBitmapImage.BeginInit();
                            myBitmapImage.StreamSource = ms;
                            myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                            myBitmapImage.DecodePixelHeight = 500;
                            myBitmapImage.DecodePixelWidth = 500;
                            myBitmapImage.EndInit();
                            myBitmapImage.Freeze();

                        }
                        return myBitmapImage;
                    }


                }

            }

            return myBitmapImage;

        });

        await t;
        return t.Result;
    }

в и что я использую в событии:

MyImage.Source = await s.GetBitmap(PublicVar.ConnectionString, "SELECT (UserImage) FROM Users WHERE UserID = " + id);

Но когда это сработает, моя программа выдаст ошибку его текст «Вызывающий поток не может получить доступ к этому объекту, потому что он принадлежит другому потоку». я могу сделать это исправить Dischapter.Invoke Но на самом деле это не асинхронно. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы даже можете пойти дальше и читать BLOB-объекты в виде потока. Пример здесь .

0 голосов
/ 18 января 2019

Не вызывайте Task.Run, но используйте асинхронные методы ADO.NET:

public async Task<BitmapImage> GetBitmap(string ConnectingString, string SQLCode)
{
    SqlConnection con1 = new SqlConnection(ConnectingString);
    //Open Connection String
    await con1.OpenAsync();
    // load image from the database 
    SqlCommand Commandcmd = new SqlCommand(SQLCode, con1);
    BitmapImage myBitmapImage = new BitmapImage();
    SqlDataReader rdr1 = null;
    rdr1 = await Commandcmd.ExecuteReaderAsync();
    while (await rdr1.ReadAsync())
    {
        if (rdr1 != null)
        {
            if (rdr1[0] != DBNull.Value)
            {
                byte[] data = (byte[])rdr1[0]; // 0 is okay if you only selecting one column
                using (System.IO.MemoryStream ms = new System.IO.MemoryStream(data))
                {

                    // BitmapImage.UriSource must be in a BeginInit/EndInit block
                    myBitmapImage.BeginInit();
                    myBitmapImage.StreamSource = ms;
                    myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                    myBitmapImage.DecodePixelHeight = 500;
                    myBitmapImage.DecodePixelWidth = 500;
                    myBitmapImage.EndInit();
                    myBitmapImage.Freeze();
                }
                return myBitmapImage;
            }
        }
    }
    return myBitmapImage;
}

Task.Run выполнит указанное действие в потоке пула потоков, и вы не сможете получить доступ к элементам управления пользовательского интерфейса из любого другого потока, кроме потока диспетчера, в котором они были изначально созданы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...