【问题标题】:C# - As Delegates doing Asyn task still do i need System.Threading?C# - 作为执行异步任务的代表,我还需要 System.Threading 吗?
【发布时间】:2009-09-23 09:27:07
【问题描述】:

由于我可以使用委托执行异步操作,我怀疑在我的应用程序中使用 System.Threading 的机会很小。是否有任何我无法避免 System.Threading 的重要情况?

(只是我在学习阶段)。

例子:

class Program

{

public delegate int Total (int a,int b);

static void Main()

{

  Total tl = new Total(SumUp);
  IAsyncResult isany=tl.BeginInvoke(20,20, null, null);

    while (!isany.IsCompleted)
    {
        Console.WriteLine("Busy with other work");
    }

    int ans = tl.EndInvoke(isany);

    Console.WriteLine("Result ={0}", ans);

}

static int SumUp(int a,int b)

{
    a = a * a;

    b = b * b;

    return a + b;

}
}

【问题讨论】:

    标签: c# multithreading delegates


    【解决方案1】:

    我们在处理并发性方面不断得到越来越好的抽象,因此通常不需要更底层的构造。

    您已经找到了这种更高级别抽象的一个示例,.NET 4.0 将为我们提供一些处理并发代码(例如任务和延续)的新的非常强大的方法。

    随着时间的推移,您应该能够在越来越高的抽象级别上处理并发。在我看来,这些抽象是否存在于 System.Threading 中并不重要。

    【讨论】:

    【解决方案2】:

    异步委托在thread pool 上运行,详见here。我不得不使用显式线程的一种情况是在后台运行 UI 任务,因为线程池线程都是多线程单元,而 UI 任务只能在单线程单元中运行。上面的链接还给出了更多不适合使用线程池的情况。

    虽然大多数短期后台任务应该使用线程池或异步委托来完成,但仍然存在需要创建显式线程的情况。 System.Threading 不会很快消失。

    【讨论】:

    • thecoop 是对的。 . .他的回答暗示线程池线程是有限的资源。一个很好的练习是编写一个小程序包来模拟非线程池线程上的 Begin/EndInvoke 功能。您可以实现 IAsyncResult、通用方法、回调和其他好东西来完善这个包。
    【解决方案3】:

    我还需要 System.Threading

    “需要”是什么意思? System.threading 的类型在始终加载的mscorlib 程序集中定义。如果您想在代码中避免使用完全限定名称,您只需说 using System.Threading

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多