2

如果您能告诉我关于多次异步调用同一方法的意见,我将不胜感激。我更感兴趣的是了解这项活动的安全方面。我在这里发布了一个控制台代码,其中包含一个我异步调用四次的方法,它运行良好。到目前为止,我还没有注意到任何问题。但我想确定。请输入以下代码:

public class OneMethodCalledServeralTimes
    {
        protected async Task<bool> DoSomeWork(Values values, int whenItIsCalled, string description)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            await Task.Delay(values.Value);

            Console.WriteLine("{0} Completed in {1} and this was called: {2}",description, stopWatch.ElapsedMilliseconds, whenItIsCalled);

            return true;
        }

        public bool DoAllWork()
        {
            Console.WriteLine("=====================Started doing weekend Chores===================");
            var task1 = DoSomeWork(new Values { Value = 10000 }, 1, "First work to be done");
            var task2 = DoSomeWork(new Values {Value = 7000}, 1, "First work to be done");
            var task3 = DoSomeWork(new Values { Value = 4000 }, 2, "second work to be done");
            var task4 = DoSomeWork(new Values { Value = 1000 }, 3, "third work to be done");

            Task.WaitAll(task1, task2, task3, task4);

            Console.WriteLine("=====================Completed doing weekend Chores===================");

            return true;
        }

    }

以下是调用上述调用的控制台应用程序:

static void Main(string[] args)
        {
            //var weekend = new HomeWork().DoAllWork();

            Console.WriteLine("############################Using proper methods#############################");


            var workToBeDone= new OneMethodCalledServeralTimes().DoAllWork(); //Passing parameters and the most successful one

            Console.WriteLine("It took the entire four mothod {0} seconds to finish", stopewach.ElapsedMilliseconds/1000.0);

            Console.ReadKey();
        }

我也非常欢迎任何关于多次异步调用相同方法的缺点和优点的简明观点

4

1 回答 1

8

这取决于方法 - 但它肯定不是天生不安全的。编译器生成的状态机中没有任何东西会引入问题。但是,如果您的异步方法使用共享状态,则适用正常的警告。例如,您不想同时调用多个线程:

static Task DoBadThingsAsync(List<string> list)
{
    await Task.Delay(500);
    list.Add("Hello!");
}

...因为List<T>如果任何线程执行写入(没有同步),在多线程环境中使用是不安全的。

需要注意的一点是,如果您有预计将在“单线程同步上下文”中使用的异步方法(例如 WPF 或 WinForms 应用程序中的 UI 线程),那么您无需担心线程安全- 但您确实需要担心一般并发性,因为该方法的两个调用可能同时“实时”。

于 2013-09-18T15:41:34.257 回答