0

在下面的代码中,我试图在另一个线程中执行一个返回值的方法。但是,它只是不起作用!

    public void main()
    {
       lstChapters.DataContext = await TaskEx.WhenAll(LoadChapters());
    }



   //CAN'T use  async in this function, it requires Task<> which
   //Error appears on the code inside []

   public [async Task<object>] Convert(object[] values, Type targetType,
     object parameter, System.Globalization.CultureInfo culture)
   {
      dictChapters data = await IQ_LoadQuranXML.LoadChapters(TypeIndex);
   }




    internal static async Task< IEnumerable<dictChapters>> LoadChapters()
    {
        var element = XElement.Load("xml/chapters.xml");

        Task < IEnumerable < dictChapters >>  something = (Task<IEnumerable<dictChapters>>)  await TaskEx.Run(delegate
        {

        IEnumerable<dictChapters> Chapters =  
           from var in element.Descendants("chapter")
           orderby var.Attribute("index").Value
           select new dictChapters
           {
              ChapterIndex = Convert.ToInt32(var.Attribute("index").Value),
              ChapterArabicName = var.Attribute("name").Value,
              ChapterType = var.Attribute("type").Value,
           };
            return Chapters;}
        );

        return something; //An ERROR on this line
     }

    //Overriding method which does not return IEnumerable type. And it accepts index as integer.
    internal static dictChapters LoadChapters(string chIdx = "0")
    {
        int chIdxInt = Convert.ToInt32(chIdx);
        List<dictChapters> Chapters = (List<dictChapters>)  LoadChapters(); // ERROR is on this line too
        return Chapters.ElementAt(chIdxInt - 1); //index of chapter in the element starts from 0
    }

错误是:

无法将类型“ System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<iq_main.dictChapters>>”隐式转换为“ System.Collections.Generic.IEnumerable<iq_main.dictChapters>”。存在显式转换(您是否缺少演员表?)

另一个错误是..

无法将类型“ System.Threading.Tasks.Task<System.Collections.Generic.List<iq_main.dictChapters>>”转换为“System.Collections.Generic.List<iq_main.dictChapters>

当我return (IEnumerable<dictChapters>) something在运行时明确地投射“某物”时,我得到“InvalidCastException”。

4

2 回答 2

3

实际上,您会更早地收到运行时强制转换错误。问题是你的TaskEx.Run结果。当你有await东西时,Task包装被移除。

public void main()
{
  lstChapters.DataContext = await LoadChapters();
}

internal static Task<List<dictChapters>> LoadChapters()
{
  return TaskEx.Run(delegate
  {
    var element = XElement.Load("xml/chapters.xml");
    IEnumerable<dictChapters> Chapters =  
        from var in element.Descendants("chapter")
        orderby var.Attribute("index").Value
        select new dictChapters
        {
          ChapterIndex = Convert.ToInt32(var.Attribute("index").Value),
          ChapterArabicName = var.Attribute("name").Value,
          ChapterType = var.Attribute("type").Value,
        };
    return Chapters.ToList();
  });
}

您的代码还有一些其他问题。请记住,像这样的枚举是延迟执行的。您可能希望return Chapters.ToList();XML 解析发生在线程池线程上。

于 2012-07-15T00:38:50.480 回答
1

由于您确实在 TaskEx.Run 上等待,因此您将返回可枚举,而不是任务。

对于您正在做的事情,我建议将 LoadChapters 保留为正常/同步代码,然后通过 Task.Run 调用它,或者按原样调用它。

由于延迟执行,AFAICT 您当前的代码并没有真正帮助任何事情,因为您仍在同步加载。

可以删除 main 中的 Task.WhenAll ,只需等待 LoadChapters (或任何异步方法

于 2012-07-15T00:56:54.717 回答