C#考试70-483参考书的例子有错吗? (父/子线程)
在
C# 70-483 Exam Ref的第一版中,示例1-12给出了将子任务附加到父任务的示例.我认为这是错误的,并希望有人在继续这个假设之前检查我的理解.示例中的代码如下:
using System; using System.Threading.Tasks; namespace Chapter1 { public static class Program { public static void Main() { Task<Int32[]> parent = Task.Run(() => { var results = new Int32[3]; new Task(() => results[0] = 0,TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[1] = 1,TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[2] = 2,TaskCreationOptions.AttachedToParent).Start(); return results; }); var finalTask = parent.ContinueWith(parentTask => { foreach (var i in parentTask.Result) { Console.WriteLine(i); } }); finalTask.Wait(); } } } 问题出在Task.Run上. MSDN explains这不允许附加子任务.我认为这可能是.NET版本在发布时(2013年)的一个问题,但MSDN文章是在本书出版前两年发布的. 这特别棘手,因为如果执行上面的代码,结果数组确实将其值设置为0,1和2.但是,如果lambda做了比这更耗时的事情,那么在该索引处没有设置任何值在数组中. 例如,下面的代码分别将“one”和“two”分配给结果元素1和2,但元素0为null. using System; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace Chapter1 { public static class Program { public static void Main() { Task<String[]> parent = Task.Run(() => { var results = new String[3]; new Task(() => { SHA256 mySHA256 = SHA256.Create(); byte[] messageBytes = Encoding.ASCII.GetBytes("asdf"); byte[] hashBytes = mySHA256.ComputeHash(messageBytes); results[0] = BitConverter.ToString(hashBytes).Replace("-",""); },TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[1] = "one",TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[2] = "two",TaskCreationOptions.AttachedToParent).Start(); return results; }); var finalTask = parent.ContinueWith(parentTask => { foreach (var i in parentTask.Result) { Console.WriteLine(i); } }); finalTask.Wait(); } } } 当我使用任务工厂启动父任务(未在示例中显示)时,一切都按预期工作,TaskCreationOptions影响子线程的同步. 所以我的问题是: >我的理解是正确的,将TaskCreationOptions.AttachedToParent传递给在Thread.Run下创建的子任务是没有意义的吗? 解决方法
我相信你的问题(断言)都是正确的.
This MSDN文章似乎很好地涵盖了它.
Re 2,正如文章所说,将AttachedToParent传递给以Task.Run()开头的任务会产生“不可预测的”结果,其中一个结果就是你观察到的结果. 我应该添加一个细微差别,即“子”任务将在ContinueWith()开始后继续运行,因此它们会在相应的Console.WriteLine()之前获得(一点点)额外时间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- flash遮住div层解决办法(兼容所有浏览器)
- react-native run-android error: unknown host
- VUE系列三:实现跨域请求(fetch/axios/proxytabl
- 是否存在与(0 | 1)*(1100 | 1010 | 1001 | 0110
- Oralce中VARCHAR2()与NVARCHAR2()的区别介绍
- vue如何获取点击事件源的方法
- C#:如何将字符串转换为DateTime,其中字符串可以
- 利用swfobject将swf嵌入到jsp页面
- C#多线程编程之使用ReaderWriterLock类实现多用户
- reactjs – React Testing – TypeError:localS