C#Parallelism Woes

时间:2015-03-12 08:14:38

标签: c# .net windows forms asynchronous

所以,我一直在尝试用C#学习考试70-483,因为我需要相当绝望地获得我的认证。

然而,Parallelism刚刚让我头痛不已。我理解基本的想法,但我读过的很多代码都暗示了在异步方法中只应使用异步方法的假设。

或多或少,我在问我和#34; WriteXMLAsync"和#34; WriteXMLAsyncTwo。"

如果我没弄错的话,两者都与主线程并行运行。 那么,在#X; 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的回答。 我会更多地参考他对我所寻找的信息的评论。

1 个答案:

答案 0 :(得分:0)

WriteXMLAsync应该像这样声明,

static async Task WriteXMLAsync()
{
    ...
}

允许你这样做

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

然后,有一个明显的区别。

注意: async方法只有在实现事件处理程序时才返回void,否则不会返回(尽管它会编译。)