Task.Runで動的

サラス

無関係なクラスに同じ名前の長時間実行タスクがあります。私はこのコードを動的を使用する一般的な方法で使用しようとしていました。次のエラーが発生します

Microsoft.CSharp.RuntimeBinder.RuntimeBinderExceptionはユーザーコードによって処理されませんでしたMessage =タイプ「void」を「オブジェクト」に暗黙的に変換できません

コードを次のように分離しようとしました

class Program
{
    static void Main(string[] args)
    {
        MainAsync();
        Console.ReadKey();
    }
    static async void MainAsync()
    {
        var classA = new ClassA();
        var classB = new ClassB();
        await RunTask1(classA);
        await RunTask1(classB);
        await RunTask(classA);
        await RunTask(classB);
    }
    static async Task RunTask(dynamic val)
    {
        await Task.Run(() => val.CommonLongRunningTask());
    }
    static async Task RunTask1(ClassA val)
    {
        await Task.Run(() => val.CommonLongRunningTask());
    }
    static async Task RunTask1(ClassB val)
    {
        await Task.Run(() => val.CommonLongRunningTask());
    }
}
internal class ClassA
{
    public void CommonLongRunningTask()
    {
        Console.WriteLine("Class A CommonLongRunningTask");
    }
}
internal class ClassB
{
    public void CommonLongRunningTask()
    {
        Console.WriteLine("Class B CommonLongRunningTask");
    }
}

動的ではなくオブジェクト自体(RunTask1)を渡すと、機能します。私はダイナミックに通過しているときに何が起こっているのかを理解しようとしています。

ピーターリッチー

言語内の何かまで追跡することはまだできていませんが、動的式を使用した式ラムダを使用できないようです。 更新:voidメソッド呼び出しがあるかどうかに関係なく、を含む式dynamicは常に型です。言語アスペクトの更新をdynamic参照してください。

ステートメントラムダは機能します:

private static async Task RunTask(dynamic val)
{
    await Task.Run(() =>
    {
        val.CommonLongRunningTask();
    });
}

更新:

事実上、ここで起こっていることは、コンパイラーがこれに遭遇したときです。

() => val.CommonLongRunningTask()

それはそれで以下と同等であると解釈します:

() => {return val.CommonLongRunningTask();}

...コンパイル時に、呼び出したものが何も返さないことを知らvalないためです。実行時に、val.CommonLongRunningTask()型はあるvoidreturn最小公分母に対してもその値をとることができない式に遭遇し、objectメッセージとともに例外をスローします。Cannot implicitly convert type 'void' to 'object'

RunTask次のように書き直した場合も、まったく同じ例外が発生します。

    private static async Task RunTask(dynamic val)
    {
        await Task.Run(() =>
        {
            return val.CommonLongRunningTask();
        });
    }

言語の側面

もう少し調査/議論した後、C#仕様のセクション7.5.2に、これが発生する理由が詳しく説明されているようです。基本的に、動的に関係するものはすべてそれ自体が動的型であり(コンパイル時にコンパイラーはバインド方法を認識できないため)、したがって「val.CommonLongRunningTask()」を動的を返すものと見なします(したがって、実行時エラーが発生します)。実行時に無効であることに気付いたとき)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Ansible: run a failed task

分類Dev

Task.FromResult()とTask.Run()

分類Dev

public static Task Run(Func <Task> function);

分類Dev

Calling await on a task created with Task.Run()

分類Dev

Windows Task Scheduler, run task if task isn't running?

分類Dev

Task.Runの奇妙な動作

分類Dev

Task.Run()とawait Task.Run()の違いは何ですか?

分類Dev

Task.Run( () MethodName()) and await Task.Run(async () => MethodName())

分類Dev

Task.Run with Parameter(s)?

分類Dev

Task.Run in Static Initializer

分類Dev

Javafx - Execution failed for task ':run'

分類Dev

Force run of a task skipped by ShortCircuitOperator

分類Dev

Task.Runの代替

分類Dev

how to run setuid task properly?

分類Dev

For Loop result in Overflow with Task.Run or Task.Start

分類Dev

Is Task.Run() the same as creating Task instance and then Start() it?

分類Dev

Task.Yield(); SyncAction(); vs Task.Run(()=> SyncAction());

分類Dev

How do I run a mix task from within a mix task?

分類Dev

Task.RunとTask.Factory.StartNewの違いは何ですか

分類Dev

Task.Run()なしで並列化

分類Dev

Task.Runを別のTask.Run()でラップできますか?

分類Dev

Task.Start()、Task.Run()、Task.Factory.StartNew()の使用について

分類Dev

Task ContinueWithの動作で非同期?

分類Dev

呼び出しが曖昧なのはなぜですか?'Task.Run(Action)'および 'Task.Run(Func <Task>)'

分類Dev

Run task only if host does not belong to a group

分類Dev

Run a batch file with Windows task scheduler

分類Dev

Good way to run recurring background task in WCF?

分類Dev

Call Back Method for Task.Run()

分類Dev

.ToListAsync() vs .ToList() + Task.Run

Related 関連記事

  1. 1

    Ansible: run a failed task

  2. 2

    Task.FromResult()とTask.Run()

  3. 3

    public static Task Run(Func <Task> function);

  4. 4

    Calling await on a task created with Task.Run()

  5. 5

    Windows Task Scheduler, run task if task isn't running?

  6. 6

    Task.Runの奇妙な動作

  7. 7

    Task.Run()とawait Task.Run()の違いは何ですか?

  8. 8

    Task.Run( () MethodName()) and await Task.Run(async () => MethodName())

  9. 9

    Task.Run with Parameter(s)?

  10. 10

    Task.Run in Static Initializer

  11. 11

    Javafx - Execution failed for task ':run'

  12. 12

    Force run of a task skipped by ShortCircuitOperator

  13. 13

    Task.Runの代替

  14. 14

    how to run setuid task properly?

  15. 15

    For Loop result in Overflow with Task.Run or Task.Start

  16. 16

    Is Task.Run() the same as creating Task instance and then Start() it?

  17. 17

    Task.Yield(); SyncAction(); vs Task.Run(()=> SyncAction());

  18. 18

    How do I run a mix task from within a mix task?

  19. 19

    Task.RunとTask.Factory.StartNewの違いは何ですか

  20. 20

    Task.Run()なしで並列化

  21. 21

    Task.Runを別のTask.Run()でラップできますか?

  22. 22

    Task.Start()、Task.Run()、Task.Factory.StartNew()の使用について

  23. 23

    Task ContinueWithの動作で非同期?

  24. 24

    呼び出しが曖昧なのはなぜですか?'Task.Run(Action)'および 'Task.Run(Func <Task>)'

  25. 25

    Run task only if host does not belong to a group

  26. 26

    Run a batch file with Windows task scheduler

  27. 27

    Good way to run recurring background task in WCF?

  28. 28

    Call Back Method for Task.Run()

  29. 29

    .ToListAsync() vs .ToList() + Task.Run

ホットタグ

アーカイブ