如何创建一个采用一种类型列表并将其转换为另一种类型的任务

时间:2015-04-06 17:57:02

标签: c# asynchronous async-await task

我正在尝试将某种类型的列表转换为另一种类型的列表,并且列表非常大,因此转换I图像对于所有创建的新对象来说都是计算量很大,所以我想解决这个问题。一个任务,所以我可以等待结果。我对C#中的异步代码并不是全新的,但也许这是我第一次遇到需要像以前一样创建异步兼容方法。

下面的代码给了我红色的曲线和错误似乎无论我编写代码的方式。有人可以看看这个,并告诉我我写错了什么部分。

我试图以lambda形式显式声明参数,我尝试创建一个Func<,>但似乎没什么用。

    public async Task<ComplexTypeAdapters.GetQuestionsByTestTakenResult> Client4_GetQuestionsByTestTaken( long? testResultId, string cultureTag )
    {
        var result = await Context.Client4_GetQuestionsByTestTaken(testResultId, cultureTag).ToListAsync();

        //var list = new List<ComplexTypeAdapters.GetQuestionsByTestTakenResult>( );

        return await Task.Factory.StartNew( () =>
        {
            var list = new List<ComplexTypeAdapters.GetQuestionsByTestTakenResult>( );
            foreach( Client4_GetQuestionsByTestTaken_Result one in result )
            {
                var res = new ComplexTypeAdapters.GetQuestionsByTestTakenResult
                {
                    Id = one.id, App = one.App, Ver = one.Ver, Name = one.Name, Script = one.Script
                };
                try
                {
                    res.SampleDocs = XElement.Parse( one.sampleDocs );
                } catch( Exception )
                {
                    res.SampleDocs = null;
                }
                try
                {
                    res.Instructions = XElement.Parse( one.instructions );
                } catch( Exception )
                {
                    res.Instructions = null;
                }
                try
                {
                    res.SampleDocsFolder = XElement.Parse( one.sampleDocsFolder );
                } catch( Exception )
                {
                    res.SampleDocsFolder = null;
                }
                list.Add( res );
            }
            return list;
        } );

        return returnList;
    }

1 个答案:

答案 0 :(得分:1)

  

我想在任务上解决此问题,以便等待结果

我假设您希望在此处理过程中释放UI线程。

在这种情况下,假设您已经编写为Client4_GetQuestionsByTestTaken的同步代码,那么您可以这样做:

await Task.Run(() => Client4_GetQuestionsByTestTaken(testResultId, cultureTag));