使用任务:ContinueWith 需要我的业务逻辑不需要的 return 语句
Using Tasks : ContinueWith needs a return statement which my business logic doesn't require
我昨天开始为我的一个小项目使用 Tasks。在代码中设置任务逻辑后,我意识到我被迫在我的 ContinueWith() 函数中使用 return 语句。
有什么方法可以避免 return 在 ContinueWith 中,即使 myTask
首先需要 return 一个对象?
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
})
.ContinueWith<List<Object>>((antecedant) =>
{
//business logic : needs to use antecedant
return null; //can i get rid of this? I don't need to return an object in this section
}, TaskScheduler.FromCurrentSynchronizationContext());
我们就说 return 空语句让我很烦...
注意:为了回应 Yuval 的评论,我使用的是 .net framework 4.5
解决方案
根据 CoryNelson 的评论,我想出了这段代码。完全符合我的需求。
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
});
Task myFollowingTask = myTask.ContinueWith((antecedant) =>
{
//business logic using antecedant
}, TaskScheduler.FromCurrentSynchronizationContext());
我不再需要 ContinueWith 中的 return 语句。
Here 是我获取所需信息的地方。查看代码示例
如果您想在任务之外访问结果,则需要将该结果提供给 myTask
的输出。
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
})
.ContinueWith((antecedant) =>
{
//business logic : needs to use antecedant
return antecedant.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());
这将导致 myTask.Result
与 ContinueWith
中的 antecedant.Result
相同。
解决问题的两种方法:
拆分任务变量的声明:
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
});
Task taskContinuation = myTask.ContinueWith((antecedant) =>
{
//business logic : needs to use antecedant
}, TaskScheduler.FromCurrentSynchronizationContext());
这将允许您独立地 运行 这两个任务,其中 continuation
的类型是 Task
。
第二种,也是更好的方法 IMO 将使用 async-await
:
public async Task CreateFooAsync()
{
List<object> objects = await Task.Run(() => /* Create object */);
// here you're on the UI thread, continue execution flow as normal.
}
注意 async-await
的语义意味着第一个任务将异步等待创建对象。
我昨天开始为我的一个小项目使用 Tasks。在代码中设置任务逻辑后,我意识到我被迫在我的 ContinueWith() 函数中使用 return 语句。
有什么方法可以避免 return 在 ContinueWith 中,即使 myTask
首先需要 return 一个对象?
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
})
.ContinueWith<List<Object>>((antecedant) =>
{
//business logic : needs to use antecedant
return null; //can i get rid of this? I don't need to return an object in this section
}, TaskScheduler.FromCurrentSynchronizationContext());
我们就说 return 空语句让我很烦...
注意:为了回应 Yuval 的评论,我使用的是 .net framework 4.5
解决方案
根据 CoryNelson 的评论,我想出了这段代码。完全符合我的需求。
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
});
Task myFollowingTask = myTask.ContinueWith((antecedant) =>
{
//business logic using antecedant
}, TaskScheduler.FromCurrentSynchronizationContext());
我不再需要 ContinueWith 中的 return 语句。
Here 是我获取所需信息的地方。查看代码示例
如果您想在任务之外访问结果,则需要将该结果提供给 myTask
的输出。
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
})
.ContinueWith((antecedant) =>
{
//business logic : needs to use antecedant
return antecedant.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());
这将导致 myTask.Result
与 ContinueWith
中的 antecedant.Result
相同。
解决问题的两种方法:
拆分任务变量的声明:
Task<List<Object>> myTask = Task<List<Object>>.Factory.StartNew(() =>
{
//business logic creating an Object to return
//return Object created
});
Task taskContinuation = myTask.ContinueWith((antecedant) =>
{
//business logic : needs to use antecedant
}, TaskScheduler.FromCurrentSynchronizationContext());
这将允许您独立地 运行 这两个任务,其中 continuation
的类型是 Task
。
第二种,也是更好的方法 IMO 将使用 async-await
:
public async Task CreateFooAsync()
{
List<object> objects = await Task.Run(() => /* Create object */);
// here you're on the UI thread, continue execution flow as normal.
}
注意 async-await
的语义意味着第一个任务将异步等待创建对象。