使用委托调用async将方法调用传递给方法

时间:2016-06-27 13:18:56

标签: c# delegates

我有以下代码,我正在尝试编写一个委托,允许将服务调用传递给方法,但我真的很挣扎。 任何人都可以建议这是可能的吗?

非常感谢,

这是一个简单的例子,但请注意两种方法是如何相同的,除了它们各自进行的内部服务调用。我想将他们调用的方法传递给DoIt方法,即

示例

In [434]: arr = np.arange(1000000, dtype=np.float)

In [435]: timeit np.where(arr > 3, arr, np.nan)
100 loops, best of 3: 3.61 ms per loop

In [436]: timeit arr[arr < 4] = np.nan
1000 loops, best of 3: 564 µs per loop

In [437]: timeit np.putmask(arr, arr < 4, np.nan)
1000 loops, best of 3: 1.08 ms per loop

要更改的代码

var result1 = DoIt(await _service.GetMethodA(..))

var result2 = DoIt(await _service.GetMethodB(..))

签名

async Task<ICustomer> ICustomerSomething.GetIt(Guid pupilId)
{
    var t = await _service.GetMethodA(..)
}

async Task<ICustomer> ICustomerSomething.GetSomethingElse(Guid pupilId)
{
    var t = await _service.GetMethodB(..)
}

更新

我已经做了建议的更改,虽然它没有编译,如下所示

错误消息

'System.Threading.Tasks.Task&GT;'到'System.Threading.Tasks.Task'MyService

更改后的代码

async Task<ICustomer> ICustomerService.Get(Guid pupilId)

async Task<IEnumerable<ICar>> ICustomerService.GetSomethingElse(Guid pupilId)

2 个答案:

答案 0 :(得分:1)

As I describe on my blog,异步方法就像同步方法一样,除了它们返回 protected void btnAdd_Click(object sender, EventArgs e) { listBox1.Items.Add(textBox3.Text); NumericUpDown1.Maximum = 100; NumericUpDown1.Minimum = 0; int previousNoItems; Int.TryParse(textBox5.Text, out previousNoItems); textBox5.Text += previousNoItems + NumericUpDown1.Value; } / Task而不是Task<T> / void。因此,异步方法的委托是T,返回Func / Task

在这种情况下:

Task<T>

其中Func<.., Task<TResult>> TResultresult1的类型,result2是传递给..GetMethodA的参数的类型

这可以用作:

GetMethodB

或者,您可以在lambda表达式中传递参数public async Task<TResult> DoIt(Func<.., Task<TResult>> func, ..) { return await func(..); } DoIt(_service.GetMethodA, ..); ,这样可以将您的委托类型简化为..,如下所示:

Func<Task<TResult>>

答案 1 :(得分:0)

System.Threading.Tasks.Task<T> DoIt<T>(Func<System.Threading.Tasks.Task<T>> func)
{
    return func();
}

async System.Threading.Tasks.Task Main()
{
    await DoIt(() => System.Threading.Tasks.Task.FromResult(1));

    await DoIt(() => System.Threading.Tasks.Task.FromResult(""));
}