What you want to do is not that difficult ! PictueBox.LoadAsync provides everything you need.
You can use PictureBox.LoadAsynch(
string url) : explanation, warnings, and code example, here: [
^] to load a picture from a local file, or a URL.
PictureBox.LoadAsynch is supported in: .NET Framework 4.5, 4, 3.5, 3.0, 2.0; and, .NET Framework Client Profile 4, 3.5 SP1.
Handling progress in loading using LoadAsynch simply requires handling the PictureBox.LoadProgressChanged Event [
^] supported in .NET FrameWork 2.0~4.0.
Within the LoadProgressChanged event you
could call PictureBox.CancelAsync() to terminate the loading process, if necessary.
Note: I have not tested using LoadAsync on a PictureBox in a long time: perhaps since .NET 3.0: no guarantees.
You could also use a very simple BackGroundWorker [
^] threading solution, or explore the new features async/await in .NET FrameWork 4.5., Visual Studio 2012: see the links in the section on this page titled "Working with images:" [
^].
You may need to use a Timer to give some feedback to the user if the image is not loaded in a certain timespan: but, using a MessageBox is
not a good choice because it's modal: it will block the main UI thread, and require user action to dismiss. If it is necessary to allow the user to cancel the load operation while it is happening, perhaps consider making some button visible that's hidden when not loading.
There are examples of loading a PictureBox and showing progress here on CodeProject: just search :)