【发布时间】:2014-08-24 11:09:51
【问题描述】:
我非常喜欢在 C# 中使用 Tasks,但是当我尝试从方法返回 Task 并且该方法将在其内部执行多个任务时,我感到困惑。那么我是否让我的方法启动一个新任务,然后在其中按顺序执行所有操作?用 .ContinueWith() 完成这一切很难让我全神贯注
例子:
public Task<string> GetSomeData(CancellationToken token)
{
return Task.Factory.StartNew(() =>
{
token.ThrowIfCancellationRequested();
var initialData = GetSomeInteger(token).Result;
return GetSomeString(initialData, token).Result;
});
}
public Task<int> GetSomeInteger(CancellationToken token)
{
return Task<int>.Factory.StartNew(() =>
{
return 4;
}, token);
}
public Task<string> GetSomeString(int value, CancellationToken token)
{
return Task<string>.Factory.StartNew(() =>
{
return value.ToString();
}, token);
}
我不确定如何编写此方法以使其正确使用任务。我想我只是觉得那里应该有一个 .ContinueWith 之类的东西。
可能的修复??
public Task<string> GetSomeData(CancellationToken token)
{
return GetSomeInteger(token).ContinueWith((prevTask) =>
{
return GetSomeString(prevTask.Result, token);
}, token).Unwrap();
}
【问题讨论】:
-
如果没有上下文,很难推荐一些东西。您能否提供一些有关返回
Tasks 的方法的具体细节? -
你能显示
SomeOtherMethodWhichReturnsTask和MethodWhichAlsoReturnsTask的实际声明吗?你现在拥有的有点疯狂,因为它是一个返回Task<Task<string>>的方法,我怀疑这是错误的...... -
@Serge 我猜这是否是编写返回任务的方法的最佳方法,当该方法需要调用其他也返回任务的方法时。我想知道是否需要使用 .ContinueWith 将这些调用更改为其他方法
-
@ReedCopsey 确定我刚刚写了这些并编造了一些东西。认为不需要知道那些其他方法是什么或做了什么。
-
@ReedCopsey 我不这么认为。我很确定我使用的 UnWrap 在 .NET 4.0 msdn.microsoft.com/en-us/library/dd780917.aspx