private void Download2Callback(IAsyncResult ar)
        {
            var    localState = (State)ar.AsyncState;
            string data2;

            try
            {
                data2 = _downloadFromInternet2.EndDownload(ar);
            }
            catch (Exception exception)
            {
                localState !.TaskCompletionSource.TrySetException(exception);
                return;
            }

            bool readyToWrite;

            lock (localState)
            {
                localState.Data2    = data2;
                localState.HasData2 = true;
                readyToWrite        = localState.HasData1 && localState.HasData2;
            }

            if (readyToWrite)
            {
                SaveResults(localState);
            }
        }
Exemple #2
0
        // Very old-school implementations use an IAsyncResult by Jeffrey Richter from an old MSDN article:
        //   https://docs.microsoft.com/en-us/archive/msdn-magazine/2007/march/implementing-the-clr-asynchronous-programming-model
        // This example code uses the much simpler Task/TaskCompletionSource approach introduced in .NET 4.0.

        public IAsyncResult BeginDownloadAndSave(AsyncCallback callback, object state)
        {
            var tcs = new TaskCompletionSource <object>(state);

            _downloadFromInternet.BeginDownload(ar =>
            {
                string data;
                try
                {
                    data = _downloadFromInternet.EndDownload(ar);
                }
                catch (Exception exception)
                {
                    tcs.TrySetException(exception);
                    return;
                }

                _saveToDatabase.BeginSave(data, ar =>
                {
                    try
                    {
                        _saveToDatabase.EndSave(ar);
                    }
                    catch (Exception exception)
                    {
                        tcs.TrySetException(exception);
                        return;
                    }

                    tcs.TrySetResult(null);
                }, null);
            }, null);
            return(tcs.Task);
        }