C#考试70-483参考书的例子有错吗? (父/子线程)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#考试70-483参考书的例子有错吗? (父/子线程),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2513字,纯文字阅读大概需要4分钟。
内容图文
![C#考试70-483参考书的例子有错吗? (父/子线程)](/upload/InfoBanner/zyjiaocheng/775/54812956f51f4557b70e27adb5c95ef6.jpg)
在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下创建的子任务是没有意义的吗?
>我的假设是否正确,本书的示例仅有效,因为子任务lambdas只是执行在父线程终止之前完成的赋值?
解决方法:
我相信你的问题(断言)都是正确的. This MSDN文章似乎很好地涵盖了它.
Re 2,正如文章所说,将AttachedToParent传递给以Task.Run()开头的任务会产生“不可预测的”结果,其中一个结果就是你观察到的结果.
我应该添加一个细微差别,即“子”任务将在ContinueWith()开始后继续运行,因此它们会在相应的Console.WriteLine()之前获得(一点点)额外时间.
内容总结
以上是互联网集市为您收集整理的C#考试70-483参考书的例子有错吗? (父/子线程)全部内容,希望文章能够帮你解决C#考试70-483参考书的例子有错吗? (父/子线程)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。