Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WCF中实现异步调用_C#_Wcf_Asynchronous - Fatal编程技术网

C# 如何在WCF中实现异步调用

C# 如何在WCF中实现异步调用,c#,wcf,asynchronous,C#,Wcf,Asynchronous,我想在WCF中实现异步调用。我只想异步调用Insert()操作契约。这将在历史记录表中插入记录。由于这是一个耗时的过程,我希望它是异步完成的。它没有返回类型。 代码如下: [ServiceContract] public interface IDBService { [OperationContract] void Insert(RequestDetails Requestvalue); [OperationContract] void Update(R

我想在WCF中实现异步调用。我只想异步调用Insert()操作契约。这将在历史记录表中插入记录。由于这是一个耗时的过程,我希望它是异步完成的。它没有返回类型。 代码如下:

 [ServiceContract]
 public interface IDBService
 {

    [OperationContract]
    void Insert(RequestDetails Requestvalue);

    [OperationContract]
    void Update(RequestDetails Requestvalue);

    // TODO: Add your service operations here
 }


  [DataContract]
  public class RequestDetails
  {
    [DataMember]
    public string messageType { get; set; }

    [DataMember]
    public string projectId { get; set; }

    [DataMember]
    public string jsonMessage { get; set; }
  }


   public class DBService : IDBService
   {
    public string QueueDBConnectionString =   ConfigurationManager.AppSettings["QueueDBConnectionString"].ToString();
    DBConnection QueueDBConnectionObject ;
    public void Insert(RequestDetails Requestvalue)
    {
        QueueDBConnectionObject = new DBConnection(QueueDBConnectionString);
        QueueDBConnectionObject.Insert(Requestvalue);
    }

    public void Update(RequestDetails Requestvalue)
    {
        QueueDBConnectionObject = new DBConnection(QueueDBConnectionString);
        QueueDBConnectionObject.Update(Requestvalue);
    }
    }
请帮助我修改上述代码以异步方式工作。
提前感谢。

首先,更改合同以返回任务

 [ServiceContract]
 public interface IDBService
 {    
    [OperationContract]
    Task Insert(RequestDetails Requestvalue);

    [OperationContract]
    Task Update(RequestDetails Requestvalue);
 }
这就改变了实现的方式

public class DBService : IDBService
{
    public Task Insert(RequestDetails Requestvalue)
    {
        return Task.Run(() => {
            QueueDBConnectionObject = new DBConnection(QueueDBConnectionString);
            QueueDBConnectionObject.Insert(Requestvalue);
        });
    }
 }

但这可能并不安全。我不知道您的其他实现,也不知道您使用的组件。

什么是
DBConnection
?我只知道
DbConnection
,它没有
Insert
函数DbConnection是我为数据操作(如Insert/update/delete)编写的一个类。您能否指定为什么这段代码可能不安全?因为我不知道其他类的实现
QueueDBConnectionObject
看起来像是通过一个新实例分配给它:这可能会导致错误。但这在以前看起来很危险。获取编译时错误-无法将lambda表达式转换为类型“System.Threading.Tasks.TaskScheduler”,因为它不是委托类型。修复了它。它是
运行
而不是
启动