在C#5中异步多次调用同一方法安全吗

在C#5中异步多次调用同一方法安全吗,c#,asynchronous,C#,Asynchronous,如果您能让我知道关于多次异步调用同一方法的意见,我将不胜感激。我更感兴趣的是了解这项活动的安全方面。我在这里发布了一个控制台代码,其中包含一个方法,我异步调用了四次,并且运行良好。到目前为止,我没有注意到任何打嗝。但我想确定一下。请输入以下代码: public class OneMethodCalledServeralTimes { protected async Task<bool> DoSomeWork(Values values, int whenItI

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

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 Task DoBadThingsAsync(List<string> list)
{
    await Task.Delay(500);
    list.Add("Hello!");
}
静态任务DoBadThingsAsync(列表)
{
等待任务。延迟(500);
添加(“你好!”);
}
。。。因为如果任何线程执行写入(不同步),则在多线程环境中使用
List
是不安全的


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

异步多次调用同一方法本身没有什么危险。它本身也没有什么安全性。这完全取决于该方法的作用。它有副作用吗?它是否共享任何州或任何资源?如果是这样的话,这些资源是线程安全的吗?@neminem太简洁了,我会把它写进一个答案而不是一个评论中。@neminem:我写了一个非常类似的答案:)好吧,该死。现在我很难过,我没有把它作为一个答案。我认为它不够具体。尽管如此,如果我没有得到代表,至少我得到了乔恩·斯基特的评论,说他的回答和我的一样;那很有价值谢谢你的及时回复。你的观点都是正确的。然而,我想与大家分享的另一件事是:我修改了如下所示的方法,您不会认为即使这是异步方法,它的行为也会像同步方法一样!它将一次完成一项工作。如果我创建四个方法并异步调用它们,它们都将处于并行的manor.protected异步任务DoSomeWork(值,int whinitialed,字符串描述){Stopwatch Stopwatch=new Stopwatch();Stopwatch.Start();long count=0;for(int I=0;Iwait表达式,所以是的,它将同步运行。Jon和论坛成员,请接受我诚挚的歉意,因为我在评论区发布了代码。我不会再这样做了。同时,非常感谢您指出遗漏的“等待”。
static Task DoBadThingsAsync(List<string> list)
{
    await Task.Delay(500);
    list.Add("Hello!");
}