How to create an asynchronous method

前端 未结 7 2114
误落风尘
误落风尘 2020-12-22 20:18

I have simple method in my C# app, it picks file from FTP server and parses it and stores the data in DB. I want it to be asynchronous, so that user perform other operations

7条回答
  •  眼角桃花
    2020-12-22 20:47

    Any time you're doing something asynchronous, you're using a separate thread, either a new thread, or one taken from the thread pool. This means that anything you do asynchronously has to be very careful about interactions with other threads.

    One way to do that is to place the code for the async thread (call it thread "A") along with all of its data into another class (call it class "A"). Make sure that thread "A" only accesses data in class "A". If thread "A" only touches class "A", and no other thread touches class "A"'s data, then there's one less problem:

    public class MainClass
    {
        private sealed class AsyncClass
        {
            private int _counter;
            private readonly int _maxCount;
    
            public AsyncClass(int maxCount) { _maxCount = maxCount; }
    
            public void Run()
            {
                while (_counter++ < _maxCount) { Thread.Sleep(1); }
                CompletionTime = DateTime.Now;
            }
    
            public DateTime CompletionTime { get; private set; }
        }
    
        private AsyncClass _asyncInstance;
        public void StartAsync()
        {
            var asyncDoneTime = DateTime.MinValue;
            _asyncInstance = new AsyncClass(10);
            Action asyncAction = _asyncInstance.Run;
            asyncAction.BeginInvoke(
                ar =>
                    {
                        asyncAction.EndInvoke(ar);
                        asyncDoneTime = _asyncInstance.CompletionTime;
                    }, null);
            Console.WriteLine("Async task ended at {0}", asyncDoneTime);
        }
    }
    

    Notice that the only part of AsyncClass that's touched from the outside is its public interface, and the only part of that which is data is CompletionTime. Note that this is only touched after the asynchronous task is complete. This means that nothing else can interfere with the tasks inner workings, and it can't interfere with anything else.

提交回复
热议问题