相关疑难解决方法(0)

明确地实现IAsyncResult

我一般都对部分实现接口持谨慎态度.但是,IAsyncResult它有点特殊情况,因为它支持几种截然不同的使用模式.你经常使用/看看使用AsyncState/ AsyncCallbackpattern,而不是只是调用EndInvoke,使用AsyncWaitHandle或轮询IsCompleted(yuck)?

相关问题:检测ThreadPool WorkItem是否已完成/等待完成.

考虑这个类(非常近似,需要锁定):

public class Concurrent<T> {
    private ManualResetEvent _resetEvent;
    private T _result;

    public Concurrent(Func<T> f) {
        ThreadPool.QueueUserWorkItem(_ => {
                                         _result = f();
                                         IsCompleted = true;
                                         if (_resetEvent != null)
                                             _resetEvent.Set();
                                     });
    }

    public WaitHandle WaitHandle {
        get {
            if (_resetEvent == null)
                _resetEvent = new ManualResetEvent(IsCompleted);
            return _resetEvent;
        }

    public bool IsCompleted {get; private set;}
    ...
Run Code Online (Sandbox Code Playgroud)

WaitHandle(懒惰创建,正如IAsyncResult文档中所述)IsCompleted,但我没有看到AsyncState …

c# concurrency asynchronous iasyncresult

6
推荐指数
1
解决办法
9575
查看次数

提供异步编程模型:我应该吗?如果是这样,它应该是VerbAsync()还是BeginVerb()?

在c#中提供Method的同步和异步版本会询问如何提供方法的异步版本.

其中一个答案表明,类库开发人员应尽可能避免在单一责任原则的基础上提供异步方法.

  1. 这是真的?
    我不应该提供异步版本的方法吗?

  2. 如果答案为(换句话说,DO提供方法的异步版本),那么我应该遵循这篇MSDN文章中的建议,该文章指出:

IAsyncResult设计模式允许各种编程模型,但学习起来更复杂,并提供大多数应用程序不需要的灵活性.在可能的情况下,类库设计者应该使用事件驱动模型实现异步方法.在某些情况下,库设计者还应该实现基于IAsyncResult的模型.

??

"事件驱动模型"是指如果方法的同步版本是Verb(),则该方法的异步版本是Verb Async(),并且存在Verb Completed事件.
IAsyncResult模式是众所周知的Begin Verb()和End Verb()方法.

.net asynchronous class-design

5
推荐指数
1
解决办法
506
查看次数