0

コードをコンパイルすると、このエラーが発生します。mcs が間違った関数オーバーロードを検索する理由がわかりませんでした。git から現在アクティブな開発バージョンの最新版として mono を使用しています。TaskFactory クラスのソース コードと関数をチェックしました。存在します!


TaskPoc.cs(30,20): エラー CS1502: ` ' に一致する最適なオーバーロードされたメソッドにSystem.Threading.Tasks.TaskFactory.StartNew<bool>(System.Func<bool>, System.Threading.Tasks.TaskCreationOptions)は無効な引数があります /usr/local/lib/mono/4.5/mscorlib.dll (前のエラーに関連するシンボルの場所) TaskPoc. cs(30,56): エラー CS1503: 引数 `#1' は ` System.Func<TaskPoc.State,bool>' 式を型 ` System.Func<bool>'に変換できません


using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskPoc
{
  public class State
  {
    public int num;
    public string str;
  }

  public class App
  {
    public static void Main(string[] args)
    {
      State state = new State();
      state.num = 5;
      state.str = "Helllllllllllo";

      TaskCompletionSource<bool> taskCompletionSource = new TaskCompletionSource<bool>(state);
      Task<bool> taskObj = taskCompletionSource.Task;

      Func<State, bool> userMethod = (stateObj) =>
        {
            bool result = TestMethod(stateObj.num, stateObj.str);
            taskCompletionSource.SetResult(result);
            return result;
        };

      Task.Factory.StartNew<bool>(userMethod, state);

      bool result2 = taskObj.Result;
      Console.WriteLine("Result: ", result2.ToString());
    }

    public static bool TestMethod(int num, string str)
    {
      Thread.Sleep(1000);
      Console.WriteLine(string.Format("{0} {1}", num, str));
      return true;
    }
  }
}
4

1 に答える 1

3

このオーバーロードが必要だと思います: TaskFactory.StartNew<TResult>(Func<Object, TResult>, Object)

ご覧のとおり、Func<Object, TResult>mustの引数はObjectではなくStateです。

次のようにコードを修正できます。

Func<object, bool> userMethod = (state) =>
{
    State stateObj = (State)state;
    bool result = TestMethod(stateObj.num, stateObj.str);
    taskCompletionSource.SetResult(result);
    return result;
};

コードは次のように短縮できることに注意してください。

public static void Main(string[] args)
{
    int num = 5;
    string str = "Helllllllllllo";

    Task<bool> taskObj = Task.Run<bool>(() => TestMethod(num, str));

    bool result2 = taskObj.Result;
    Console.WriteLine("Result: {0}", result2);
}
于 2013-07-17T00:01:26.283 に答える