C#继续完成任务并给出结果

C#继续完成任务并给出结果,c#,C#,我使用这个代码 public static void Main() { Task<int> t = new Task<int>(() => { return 43; }); t.Start(); t.ContinueWith((i) => {return i.Result * 2; }); Console.WriteLine("i = {0}", t.Result.ToStrin

我使用这个代码

    public static void Main()
    {
        Task<int> t = new Task<int>(() => { return 43; });
        t.Start();
        t.ContinueWith((i) => {return i.Result * 2; });

        Console.WriteLine("i = {0}", t.Result.ToString());

        Console.Read();
    }
publicstaticvoidmain()
{
Task t=新任务(()=>{return 43;});
t、 Start();
t、 ContinueWith((i)=>{return i.Result*2;});
WriteLine(“i={0}”,t.Result.ToString());
Console.Read();
}
我注意到t的结果是43,而不是86。 如果我在控制台中显示的连续打印内容。 为什么结果不被ContinueWith修改

致以最良好的祝愿,这是因为创建了一个全新的任务,您忽略了该任务的结果,而是打印了第一个任务的结果,这是正确的
43
。请尝试以下代码段:

Task<int> t = new Task<int>(() => { return 43; });
t.Start();
var t2 = t.ContinueWith((i) => {return i.Result * 2; });

Console.WriteLine("i = {0}", t2.Result.ToString());
Task t=新任务(()=>{return 43;});
t、 Start();
var t2=t.ContinueWith((i)=>{返回i.Result*2;});
WriteLine(“i={0}”,t2.Result.ToString());

ContinueWith将在第一个任务完成执行时创建一个新任务,该任务可能使用或不使用同一线程,因为它取决于任务调度程序

您可以使用以获得第二个任务的结果

您的代码将如下所示

 static void Main(string[] args)
        {

            Task<int> t = new Task<int>(() => { return 43; });
            t.Start();
            Task<int> t2 = t.ContinueWith<int>((i) => { return i.Result * 2; });

            Console.WriteLine("i = {0}", t2.Result.ToString());

            Console.Read();

        }
static void Main(字符串[]args)
{
Task t=新任务(()=>{return 43;});
t、 Start();
任务t2=t.ContinueWith((i)=>{返回i.Result*2;});
WriteLine(“i={0}”,t2.Result.ToString());
Console.Read();
}

其他两个答案是正确的。还有另一个
任务
通过
ContinueWith
返回。如果你不在乎每一步。。然后,您的代码可以通过在链接它们之后分配
ContinueWith
的值而变得更小:

var t = Task.Run(() => 43)
        .ContinueWith(i => i.Result * 2);

// t.Result = 86

您会发现很多基于任务的代码都遵循这一点。当您在末尾链接
ContinueWith
时,通常不会创建和启动单个
任务
实例。

当您有一个填充实体的存储库时,我会使用continue with,但之后您将需要viewmodel:

    /// <summary>
    ///     fill automatically person data
    /// </summary>
    /// <param name="identification">search for this identification</param>
    /// <param name="cdmIdentification">this type of identification is search for</param>
    /// <returns>found person information</returns>
    [HttpPost]
    [Authorize(Policy = "RequireAuthenticatedRole")]
    public async Task<PersonEditViewModel> AutoFillPerson(string identification, PersonRepository.CDMIdentification cdmIdentification)        
    {
        // get person entity from database
        var task = new PersonRepository().GetPersonFromCdm(identification, cdmIdentification);

        // put it in a person viewmodel.
        return await task.ContinueWith((p) => new PersonEditViewModel() { Person = p.Result } ); 
    }
//
///自动填充个人数据
/// 
///搜索此标识
///这种类型的标识正在搜索中
///找到人信息
[HttpPost]
[授权(Policy=“RequireAuthenticatedRole”)]
公共异步任务AutoFillPerson(字符串标识,PersonRepository.CDMIdentification CDMIdentification)
{
//从数据库中获取个人实体
var task=newPersonRepository().GetPersonFromCdm(标识,CDMIDIdentification);
//将其放在person viewmodel中。
返回wait task.ContinueWith((p)=>newpersoneditViewModel(){Person=p.Result});
}