Вызовите HttpWebRequest в другом потоке как пользовательский интерфейс с классом Task - избегайте удаления объекта, созданного в области Task - PullRequest
0 голосов
/ 21 февраля 2011

Я хотел бы вызвать HttpWebRequest в другом потоке как пользовательский интерфейс, потому что я должен сделать 200 запросов или сервер и загруженный образ.

Мой сценарий - сделать запрос на сервере, создать изображение и вернуть изображение. Это я делаю в другой ветке. Я использую класс Task, но он автоматически вызывает метод Dispose для всех объектов, созданных в области задач. Поэтому я возвращаю нулевой объект из этого метода.

    public BitmapImage CreateAvatar(Uri imageUri, int sex)
    {
        if (imageUri == null)
            return CreateDefaultAvatar(sex);

        BitmapImage image = null;

        new Task(() =>
        {
            var request = WebRequest.Create(imageUri);
            var response = request.GetResponse();
            using (var stream = response.GetResponseStream())
            {
                Byte[] buffer = new Byte[response.ContentLength];
                int offset = 0, actuallyRead = 0;
                do
                {
                    actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);
                    offset += actuallyRead;
                } while (actuallyRead > 0);


                    image = new BitmapImage
                    {
                        CreateOptions = BitmapCreateOptions.None,
                        CacheOption = BitmapCacheOption.OnLoad
                    };
                    image.BeginInit();

                    image.StreamSource = new MemoryStream(buffer);

                    image.EndInit();

                    image.Freeze();

            }
        }).Start();

        return image;
    }

Как избежать этого? Спасибо

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Зачем использовать Task, если вам проще вызвать HttpWebRequest.BeginGetResponse ?Или просто исключите сложность HttpWebRequest и используйте WebClient.DownloadDataAsync .

1 голос
/ 21 февраля 2011

Вы не ждете задачи.

public BitmapImage CreateAvatar(Uri imageUri, int sex)
{
   BitmapImage image = null;

   new Task(() =>
    {
        ....
    }).Start();


   return image;  // But the task is still running ...
} 

Чтобы решить эту проблему, вам придется подождать () для задачи, но тогда было бы лучше вообще не использовать задачу здесь.

Реальное решение должно быть разработано в более широкой программе.

...