在c#和TPL(任务并行库)中,Task类表示一个正在进行的工作,该工作产生类型为T的值。
我想知道这个任务需要什么。FromResult方法?
也就是说:在您已经拥有生产价值的场景中,有什么必要将其重新包装到任务中?
唯一想到的是,它被用作接受Task实例的其他方法的适配器。
在c#和TPL(任务并行库)中,Task类表示一个正在进行的工作,该工作产生类型为T的值。
我想知道这个任务需要什么。FromResult方法?
也就是说:在您已经拥有生产价值的场景中,有什么必要将其重新包装到任务中?
唯一想到的是,它被用作接受Task实例的其他方法的适配器。
当前回答
Task.Run()创建一个lambda线程,不需要async并返回一个类型对象。在我的示例中,有多个任务同时运行,等待它们的完成。一旦所有任务都完成了,我就可以循环查看它们的结果。的任务。FromResult用于推送不是task生成的任务结果。
这个任务。FromResult在这种情况下推一个类型对象RecordStruct类的Result类。我创建的任务调用函数getData。这个任务。WaitAll处理每个任务,并将结果推入RecordStruct类型的结果对象数组。然后我访问RecordStruct类的属性元素作为结果
public class RecordStruct
{
public RecordStruct(string _element) {
element = _element;
}
public string element { get;set; }
}
public class TaskCustom
{
public Task<RecordStruct> getData(string phrase)
{
if (phrase == "hello boise")
{
return Task.FromResult(new RecordStruct("Boise is a great place to live"));
}
return Task.Run(() =>
{
return new RecordStruct(phrase);
});
}
}
[Fact]
public async Task TestFactory()
{
TaskCustom obj = new TaskCustom();
List<Task<RecordStruct>> tasks = new List<Task<RecordStruct>>();
tasks.Add(obj.getData("hello world"));
tasks.Add(obj.getData("hello boise"));
Task.WaitAll(tasks.ToArray());
for(int ctr = 0; ctr < tasks.Count; ctr++) {
if (tasks[ctr].Status == TaskStatus.Faulted)
output.WriteLine(" Task fault occurred");
else
{
output.WriteLine("test sent {0}",
tasks[ctr].Result.element);
Assert.True(true);
}
}
}
其他回答
使用Task创建预计算任务。FromResult:
当您执行返回Task对象的异步操作,并且该Task对象的结果已经计算出来时,此方法非常有用。
我发现有两个常见的用例:
当您实现一个允许异步调用者的接口,但您的实现是同步的。 当您为测试而存根/模拟异步代码时。
Task.Run()创建一个lambda线程,不需要async并返回一个类型对象。在我的示例中,有多个任务同时运行,等待它们的完成。一旦所有任务都完成了,我就可以循环查看它们的结果。的任务。FromResult用于推送不是task生成的任务结果。
这个任务。FromResult在这种情况下推一个类型对象RecordStruct类的Result类。我创建的任务调用函数getData。这个任务。WaitAll处理每个任务,并将结果推入RecordStruct类型的结果对象数组。然后我访问RecordStruct类的属性元素作为结果
public class RecordStruct
{
public RecordStruct(string _element) {
element = _element;
}
public string element { get;set; }
}
public class TaskCustom
{
public Task<RecordStruct> getData(string phrase)
{
if (phrase == "hello boise")
{
return Task.FromResult(new RecordStruct("Boise is a great place to live"));
}
return Task.Run(() =>
{
return new RecordStruct(phrase);
});
}
}
[Fact]
public async Task TestFactory()
{
TaskCustom obj = new TaskCustom();
List<Task<RecordStruct>> tasks = new List<Task<RecordStruct>>();
tasks.Add(obj.getData("hello world"));
tasks.Add(obj.getData("hello boise"));
Task.WaitAll(tasks.ToArray());
for(int ctr = 0; ctr < tasks.Count; ctr++) {
if (tasks[ctr].Status == TaskStatus.Faulted)
output.WriteLine(" Task fault occurred");
else
{
output.WriteLine("test sent {0}",
tasks[ctr].Result.element);
Assert.True(true);
}
}
}
使用任务。FromResult当你想要进行异步操作时,但有时结果是同步的。你可以在这里找到一个很好的例子http://msdn.microsoft.com/en-us/library/hh228607.aspx。
一个例子就是使用缓存的方法。如果已经计算出结果,则可以返回一个已完成的任务和该值(使用task . fromresult)。如果不是,则继续执行并返回一个表示正在进行的工作的任务。
Cache示例:使用任务的Cache示例。FromResult用于预计算值