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 現在のコードは、まだ Load を同期的に実行しているため、実際には何の役にも立ちません。

メインの Task.WhenAll は削除できます。LoadChapters (または非同期メソッドが何であれ) を待つだけです。

于 2012-07-15T00:56:54.717 に答える