I have this weird issue.
The code I have on my main thread:
WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler((ss, ee) =>
{
Dispatcher.BeginInvoke(() =>
{
try
{
BitmapImage bi = new BitmapImage();
bi.SetSource(ee.Result);
WriteableBitmap wb = new WriteableBitmap(bi);
_okAction.Invoke(linkTexBox.Text, wb);
theProgressBarDialog.Close();
}
catch (Exception)
{
theProgressBarDialog.Close();
string msg = "Cannot fetch the image. Please make sure the image URL is correct";
MessageBox.Show(msg);
}
});
});
client.OpenReadAsync(new Uri("Image URL without cross domain problem"));
theProgressBarDialog.Show();
The image is loaded successfully, and got rendered on my canvas.
The weird behavior is sometimes, my whole Silverlight application seems freezing, the app does not respond to any user action EXCEPT the right-click, which pops up the default Silverlight context menu.
The buttons are disabled forcefully.
When debugging, no exception is thrown.
EDIT: If I set client.AllowReadStreamBuffering = false
, I will get exception:
{System.NotSupportedException: Read is not supported on the main thread when buffering is disabled.
at MS.Internal.InternalNetworkStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Windows.Media.Imaging.BitmapSource.ReadStream(Stream streamSource, Byte[]& buffer, Int32& position)
at System.Windows.Media.Imaging.BitmapSource.SetSourceInternal(Stream streamSource)
at System.Windows.Media.Imaging.BitmapImage.SetSourceInternal(Stream streamSource)
at System.Windows.Media.Imaging.BitmapSource.SetSource(Stream streamSource)
at ToonGui.ImportImageDialog.<>c__DisplayClass2.<OKButton_Click>b__1()}
[System.NotSupportedException]: {System.NotSupportedException: Read is not supported on the main thread when buffering is disabled.
at MS.Internal.InternalNetworkStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Windows.Media.Imaging.BitmapSource.ReadStream(Stream streamSource, Byte[]& buffer, Int32& position)
at System.Windows.Media.Imaging.BitmapSource.SetSourceInternal(Stream streamSource)
at System.Windows.Media.Imaging.BitmapImage.SetSourceInternal(Stream streamSource)
at System.Windows.Media.Imaging.BitmapSource.SetSource(Stream streamSource)
at ToonGui.ImportImageDialog.<>c__DisplayClass2.<OKButton_Click>b__1()}
Data: {System.Collections.ListDictionaryInternal}
InnerException: null
Message: "Read is not supported on the main thread when buffering is disabled."
StackTrace: " at MS.Internal.InternalNetworkStream.Read(Byte[] buffer, Int32 offset, Int32 count)\r\n at System.Windows.Media.Imaging.BitmapSource.ReadStream(Stream streamSource, Byte[]& buffer, Int32& position)\r\n at System.Windows.Media.Imaging.BitmapSource.SetSourceInternal(Stream streamSource)\r\n at System.Windows.Media.Imaging.BitmapImage.SetSourceInternal(Stream streamSource)\r\n at System.Windows.Media.Imaging.BitmapSource.SetSource(Stream streamSource)\r\n at ToonGui.ImportImageDialog.<>c__DisplayClass2.<OKButton_Click>b__1()"
Do I have to use a BackgroundWorker
class to let the downloading task run in another thread?