Hos*_*nia 1 silverlight asynchronous invoke wcf-ria-services
我在wcf ria service.like中使用了一些调用操作方法,如下面的方法:
[Invoke]
public int GetCountOfAccountsByRequestId(long requestId)
{
return ObjectContext.Accounts.Count(a => a.RequestId ==requestId);
}
Run Code Online (Sandbox Code Playgroud)
当我想从这个方法获取数据时,我使用以下代码运行并从invoke方法获取值:
int countOfAccounts = 0;
InvokeOperation<int> invokeOperation = context.GetCountOfAccountsByRequestId(selectedRequest.RequestId);
invokeOperation.Completed += (s, args) =>
{
if (invokeOperation.HasError)
{
var messageWindow = new MessageWindow(invokeOperation.Error.Message);
messageWindow.Show();
invokeOperation.MarkErrorAsHandled();
}
else
{
countOfAccounts = invokeOperation.Value;
if (countOfAccounts == 0)
{
// do some thing
}
}
};
Run Code Online (Sandbox Code Playgroud)
但是这个方法需要大量编码来运行invoke方法并从中获取值.此代码的一部分也是异步执行的.同样,某些方法必须串联实现.每个方法的返回值都与以前的方法有关. .
我该如何实现这个动作?!我怎么能写得比没有任何问题更好?
对于WCF RIA服务,我通常在项目中创建一个服务类,以便在一个地方处理与服务的所有交互.所以我会使用这个服务类来使调用更容易理解和使用.
我将您现有的代码放在一个单独的类中,这样您就可以看到它的调用方式.注意:这只是一个例子.:)
public class ServiceWrapper
{
...
public void GetCountOfAccountsByRequestId(int requestId, Action<int> callback)
{
context.GetCountOfAccountsByRequestId(requestId, InvokeComplete, callback);
}
private void InvokeComplete<T>(InvokeOperation<T> io)
{
var callback = (Action<T>)io.UserState;
if (io.HasError == false)
{
callback(io.Value);
}
else
{
var messageWindow = new MessageWindow(io.Error.Message);
messageWindow.Show();
io.MarkErrorAsHandled();
}
}
}
public class YourCode
{
public void SomeMethod()
{
serviceWrapper.GetCountOfAccountsByRequestId(selectedRequest.RequestId, GetCountCompleted);
}
public void GetCountCompleted(int countOfAccounts)
{
if (countOfAccounts == 0)
{
// do some thing
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4930 次 |
| 最近记录: |