C# 并行问题

C# Parallelism Woes

所以,我一直在努力学习 C# 考试 70-483,因为我非常需要获得我的认证。

然而,Parallelism 却让我非常头疼。我理解基本思想,但我阅读的很多代码都暗示了在异步方法中只应使用异步方法的假设。

或多或少,我在问我的"WriteXMLAsync"和"WriteXMLAsyncTwo."

有什么区别

如果我没记错的话,两者都是运行与主线程并行的。 那么,在 "WriteXMLAsync." 上进行所有等待有什么意义呢? 无论如何它似乎都不合理,因为它会做同样的事情 第二种方法,如果我是对的。

namespace TaskProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            Task TaskOne = Task.Factory.StartNew(() => WriteXMLAsync());
            Task TaskTwo = Task.Factory.StartNew(() => WriteXMLAsyncTwo());

            List<Task> TaskList = new List<Task> { TaskOne, TaskTwo };

            Task.WaitAll(TaskList.ToArray());

            Console.WriteLine("Both Tasks Have Finished.");
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey(); 
        }

        static async void WriteXMLAsync()
        {
            try
            {
                XmlWriterSettings XMS = new XmlWriterSettings();
                XMS.Async = true;

                using (XmlWriter Writer = XmlWriter.Create("FileAsyncOne.xml", XMS))
                {
                    await Writer.WriteStartElementAsync("", "root", "");
                    await Writer.WriteEndElementAsync();
                    await Writer.FlushAsync();
                }
            }
            catch (Exception Ex)
            {
                //Not what we'd normally do, but hey its good enough for this example.
                Console.WriteLine("Encountered an Exception.");
            }
        }

        static void WriteXMLAsyncTwo()
        {
            try
            {
                using (XmlWriter Writer = XmlWriter.Create("FileAsyncTwo.xml"))
                {
                    Writer.WriteStartElement("root");
                    Writer.WriteEndElement();
                }
            }
            catch(Exception Ex)
            {
                Console.WriteLine("Encountered an Exception.");
            }
        }
    }
}

//编辑: 虽然,我已经接受了Jodrell的回答。 我会更多地参考他的评论以获取我正在寻找的信息。

WriteXMLAsync应该这样声明,

static async Task WriteXMLAsync()
{
    ...
}

让你做

Task.WhenAll(new []
    {
        WriteXMLAsync(),
        Task.Factory.StartNew(() => WriteXMLAsyncTwo())
    }).Wait();

那么,区别就很明显了

注意: async 方法应该只 return void 如果它们正在实现事件处理程序,否则永远不会(尽管它会编译。 )