我有以下代码,我正在尝试编写一个委托,允许将服务调用传递给方法,但我真的很挣扎。 任何人都可以建议这是可能的吗?
非常感谢,
这是一个简单的例子,但请注意两种方法是如何相同的,除了它们各自进行的内部服务调用。我想将他们调用的方法传递给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)
答案 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>>
是TResult
和result1
的类型,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(""));
}