Service:
public class Service:IContracts { private const string baseLocation = @"E:\"; private FileStream _stream; private byte[] _buffer; public double Add(double x, double y) { return x + y; } public IAsyncResult BeginAsy(string fileName, AsyncCallback userCallback, object stateObject) { this._stream = new FileStream(baseLocation + fileName, FileMode.Open, FileAccess.Read, FileShare.Read); this._buffer = new byte[this._stream.Length]; return this._stream.BeginRead(this._buffer, 0, this._buffer.Length, userCallback, stateObject); } public string EndAsy(IAsyncResult ar) { this._stream.EndRead(ar); this._stream.Close(); Thread.Sleep(3000); return Encoding.ASCII.GetString(this._buffer); } }
client:
proxy.BeginAsy("test.txt", asy => //test.txt是大文件 【1】 { Console.WriteLine(proxy.EndAsy(asy)); }, null); Console.WriteLine(proxy.Add(1.0, 1.0));【2】
接口IService 和宿主的代码绝对正确!就不贴了
【1】中异步调用服务端的方法读取一个大文件,【2】会在【1】后立即执行,但是为什么【2】中调用服务端的那个方法是在【1】调用的方法执行完整返回后才可以执行的呢?服务端不是已经用了异步了吗?如果不是这样用,那wcf服务端的异步是怎么用的?
如果你能肯定 Add 是在 EndAsy 执行完成后才执行,那么你可以看一下你的服务行为的下列属性值:
UseSynchronizationContext
InstanceContextMode
ConcurrencyMode。
帮我看看这个问题吧http://q.cnblogs.com/q/39726/
可以参考一下
http://www.cnblogs.com/artech/archive/2007/03/02/661969.html
http://www.cnblogs.com/artech/archive/2008/08/21/1273021.html
网页用不了双工 这个好像没什么用
你这个 应该 不是 异步调用
那服务端的异步调用是怎么样的。。 我用的服务端代码就是 Artech 演示 的 异步服务端例子,不明白了。。http://www.cnblogs.com/artech/archive/2009/07/08/1519499.html
@koi: 最简单的 。就是 你在客户端 生成 异步调用 代理类。你 仔细 看看 他的 代码。抄 也要 仔细点哦。