C#泛型和void的特殊情况

路易·杜兰

我编写了一个函数,该函数将使用相对较新的异步/等待模式在线程上运行任何函数,并稍后通过可选的回调方法通知调用方。该函数非常简单,看起来像这样:

private async void DoOperationAsync<T>(Func<T> operation, Action<T> resultAction = null)
{
    if (operation == null)
        throw new ArgumentNullException("operation");

    var result = await Task<T>.Factory.StartNew(operation);

    // Notify someone that this finished
    if (resultAction != null)
        resultAction(result);
}

这对于返回值的函数非常有效。它对于返回void的函数不起作用(或者也许我不够聪明,无法使其正常工作)。我可以写这种方法的特殊情况,不假定返回类型。但是,我不知道某些C#泛型专家是否可以指出在这种情况下处理void的方法。有没有一种不涉及void函数特殊情况的方法?

斯蒂芬·克莱里

我的博客上有一个async/await介绍,可能会对您有所帮助。

我编写了一个函数,该函数将使用相对较新的异步/等待模式在线程上运行任何函数,并稍后通过可选的回调方法通知调用方。

Task.Run是为了什么

我确实希望该方法在调用线程上运行(就我而言,它将通常是应用程序的主UI线程)。

并且await已经做到了。

因此,不要像这样编写代码:

DoOperationAsync(() =>
{
  // Code that runs on threadpool thread.
  return 13;
},
result =>
{
  // Code that runs on UI thread.
  MessageBox.Show(result.ToString());
});

只是这样做:

var result = await Task.Run(() =>
{
  // Code that runs on threadpool thread.
  return 13;
});
// Code that runs on UI thread.
MessageBox.Show(result.ToString());

PSTask.Run已经具有所有必要的重载,以处理带有或不带有返回值的委托。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

特殊情况安排

来自分类Dev

解析特殊情况

来自分类Dev

C#泛型,接口和继承

来自分类Dev

AM / PM指定中午和午夜的特殊情况

来自分类Dev

对C中的指针和泛型(void)指针感到困惑

来自分类Dev

使用C ++递归解决迷宫,无法处理特殊情况

来自分类Dev

逐像素模糊c像素的图像-特殊情况

来自分类Dev

使用C ++递归解决迷宫,无法处理特殊情况

来自分类Dev

处理循环特殊情况

来自分类Dev

矩阵乘法的特殊情况

来自分类Dev

JavaScript包含特殊情况

来自分类Dev

MYSQL选择-特殊情况

来自分类Dev

延迟渲染的特殊情况

来自分类Dev

EditText inputType特殊情况仅获取数字和特殊符号

来自分类Dev

EditText inputType特殊情况仅获取数字和特殊符号

来自分类Dev

具有基类和泛型键字段的泛型C / C#

来自分类Dev

C#泛型类型typedef / alias和InvalidCastException

来自分类Dev

C#中的泛型和继承类型

来自分类Dev

C#泛型,基类和EventArgs,MVP,DI

来自分类Dev

C#使用泛型和接口实现

来自分类Dev

C# 接口和泛型协同工作

来自分类Dev

C#泛型:通配符

来自分类Dev

C#泛型列表

来自分类Dev

C#:递归泛型

来自分类Dev

双重检查锁定的特殊情况?

来自分类Dev

双重比较零特殊情况?

来自分类Dev

为加权图着色的特殊情况

来自分类Dev

SQL-按特殊情况分组

来自分类Dev

双重检查锁定的特殊情况?