如何使用参数定义Task并在c ++ \ cli中返回值?

时间:2014-08-03 15:04:56

标签: multithreading delegates c++-cli task

我在cs文件中有一个类:

public class ThreadData
{
    private int index;

    public ThreadData(int index)
    {
        this.index = index;
    }

    public static ThreadDataOutput DoWork(ThreadDataInput input)
    {
        return new ThreadDataOutput();
    }
}

现在,我有c ++代码试图初始化一个新任务和我们上面的函数:

    int numOfThread = 2;
    array<Task^>^ taskArr = gcnew array<Task^>(numOfThread);
    for (int i = 0; i < numOfThread; i++)
    {
        ThreadData^ td = gcnew ThreadData(i);
        ThreadDataInput^ input = gcnew ThreadDataInput(i);
        Task<ThreadDataOutput^>^ task = gcnew Task<ThreadDataOutput^>(td->DoWork, input);
        taskArr[i] = task;
        taskArr[i]->Start();
    }

    Task::WaitAll(taskArr, 300 * 1000);

以下代码在编译时返回2个错误:

  1. 除非创建委托实例
  2. ,否则无法获取'ThreadData :: DoWork'的地址
  3. 无法将参数1从'AmadeusWS :: ThreadDataOutput ^(__ clrcall *)(AmadeusWS :: ThreadDataInput ^)'转换为'System :: Func ^
  4. 我还尝试在cs文件中声明这样的委托:

        public static Func<ThreadDataInput, ThreadDataOutput> DoWork2 = delegate(ThreadDataInput taskDataInput)
        {
            return new ThreadDataOutput();
        };
    

    但我不知道如何从c ++ \ cli代码中调用它

    任何人都可以帮助我理解如何定义可以参数化的cli委托吗?

    感谢

1 个答案:

答案 0 :(得分:2)

为了在C ++ / CLI中创建委托实例,您需要显式地构造它,并指定它将与类和&amp;分别调用的对象。要调用的方法。

gcnew Func<TInput, TOutput>(theObject, &TheClass::MethodToInvoke)

请注意,要调用的方法是在C ++样式中指定的。

将其替换为您的任务创建,我相信此声明适合您:

Task<ThreadDataOutput^>^ task = gcnew Task<ThreadDataOutput^>(
    gcnew Func<ThreadDataInput^, ThreadDataOutput^>(td, &ThreadData::DoWork), 
    input);

修改

在您在评论中发布的代码中,您错过了调用委托的对象。

gcnew Func<Object^, Object^>(td, &ThreadData::DoWork)
                             ^^