Are you there, asynchronously written value?

In the above example, it is safe to read the m_GetResponse because assignment will happen in same UI thread given that this is being called from UI.

This is because SynchronizationContext will be captured and continued when the async method resumes. So it is the same UI thread which writes the field and reading it. This isn’t a problem here. Refer my related answer here

If called from non UI context, there is no guarantee that continuations will be ran in same thread. Usually it will be ran in ThreadPool thread. Given that the field read isn’t volatile it is possible that you could get the previous value if necessary barriers are not inserted. But you don’t need to worry about it because TPL already does this for you.

From the above link

Yes, TPL includes the appropriate barriers when tasks are queued and
at the beginning/end of task execution so that values are
appropriately made visible

So with TPL, you don’t need to worry about memory barriers given that the Tasks are already completed. But if you’re creating threads manually(which you shouldn’t be doing) and dealing with threads directly –you’ll have to insert necessary memory barriers.

Btw, ReadToEnd is a blocking call. I would not call it in UI thread. I’d use ReadToEndAsync instead to make your UI thread free. And I’ll not use field here; I’ll return the value from async method because every method call is just dependent on the parameter so it makes sense to return the value from the method.

So, your method will become something like the following

private async Task<string> SendDataAsync(string url)
{
    var request = WebRequest.Create(url);
    using(var response = await request.GetResponseAsync());
    using(var reader = new StreamReader(request.GetResponseStream());
        return await reader.ReadToEndAsync();
}

Leave a Comment