Below is the complete .NET Framework, since your question is marked as ASP.NET. (There may be different things in Silverlight.)
The short answer is: it is complex, the behavior depends on various things, including network performance characteristics, so it is incompatible, and you cannot easily control it.
Long answer:
An event is usually raised whenever the underlying thread provided by WebResponse calls the completion callback for the BeginRead operation, which WebClient uses to perform asynchronous downloads.
It seems that WebClient , as a rule, tries to read data in 64 thousand pieces. However, the streams are not required to return as much data as the requested data - it is quite possible that the BeginRead call that requests 64k will be smaller. In fact, this is quite often for streams that read data from the network - they will most likely return a smaller amount of data shortly after it appears, rather than waiting until all 64k enter.
Thus, the exact answer depends on the flow in question, and may also to some extent depend on the nature and performance of the network connection.
WebClient uses WebRequest.Create to obtain a request / response implementation that will ultimately deliver the stream, and that the extensible mechanism - .NET has 5 built-in WebRequest implementations and offers an extensibility mechanism that allows you to register additional handlers. And this is a specific implementation of WebRequest that determines the nature of the stream.
Thus, the frequency with which you receive progress events depends entirely on the type of download you are doing - you can get different results depending on what type of URL it has. (For example, http vs ftp vs file or something else.)
I'm going to take a chance that you are using HTTP.
Even then, it is quite complicated - HttpWebResponse does not always use the same thread. For example, sometimes it can return a stream received from a MemoryStream , sometimes it is a type of ConnectStream ...
Thus, you cannot say with certainty what size pieces of the main stream are likely to return, because you cannot even be sure which type of stream you are likely to receive.
As for whether you can control it, the only thing you could do is provide a custom implementation of WebRequest for a custom URL scheme. But honestly, the easiest way is to simply write code that decides whether or not to do something with a particular event, rather than trying to change the frequency of events.