【问题标题】:Is One Way Operation Contract faster?单向操作合同更快吗?
【发布时间】:2016-10-27 13:32:16
【问题描述】:

这是一个非常菜鸟的问题。我想知道 WCF 的单向合约是否比返回结果的对应合约更快。例如是

[OperationContract(IsOneWay=true)]
[WebGet(UriTemplate = "/SendData/{data}", BodyStyle = WebMessageBodyStyle.WrappedResponse,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
void SendData(string data)

快于

[OperationContract(IsOneWay=false)]
[WebGet(UriTemplate="/SendData/{data}", BodyStyle = WebMessageBodyStyle.WrappedResponse,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
bool SendData(string data)

方法 SendData 是这样的,有很多数据库代码和锁定

bool SendData(string data)
{
   check if data is valid
   if(data is valid)
   {
      lock(a database table)
      { 
         search duplicate data
         if(duplicate data found)
          {
            does not do anything (no-op)
          }
          else
          {
             save a data to the table
          }
          return true;
      }
   }
   else
   {
       return false;
   }
}

正如你所看到的 bool SendData(string data) 方法,有很多数据库和锁定代码。问题的要点是我是否应该将 Operation Contract 更改为一种方式,以便在不更改的情况下使用相同的代码获得更快的结果任何东西。或者我的 SendData 方法应该像下面这样更快地返回方法

void SendData(string data)
{
   Task.Factory.StartNew(() =>
            {
               Do Task
            }
            );
}

【问题讨论】:

  • 我使用 Android Volley 作为 JSON 客户端。

标签: c# wcf


【解决方案1】:

它本身并不是更快,它是不同的。

单向调用是一种方法。你发送消息,就是这样。这是一劳永逸的。如果服务中抛出异常,例如无法打开数据库,您将永远不会知道。消息传递到服务后,呼叫将立即返回。它不会等到服务调用完成。

如果您想等到服务调用完成以确保没有错误,则必须使用正常的非单向方法。

【讨论】:

  • 或者他可以在服务上实现回调。这样一来,就调用而言,它就像一劳永逸,但是当服务完成其任务或引发异常时,仍然可以通知用户。
  • @Nvoigt,你的意思是在下面的方法中'code' void SendData(string data) { lock code database code } 如果我将SendData方法设为一种方式,客户端不必等待锁定代码和数据库代码的持续时间,而如果我使 SendData 方法不是一种方式,它还必须等待锁定代码和数据库代码的持续时间?
  • 通知用户不是我的主要关注点。
  • @LophtGhost 基本上,是的,单向方法在确保您的消息正确传输到服务后返回立即,而正常方法会等到服务成功完成,直到它返回。单向可以被描述为“快,因为你真的不在乎它是否有效。”
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2022-11-24
  • 2011-06-19
  • 1970-01-01
  • 2016-02-21
  • 2014-07-06
相关资源
最近更新 更多