Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/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#和MongoDB驱动程序代码连接,但无法编写?_C#_Multithreading_Mongodb_Async Await_Mongodb .net Driver - Fatal编程技术网

为什么C#和MongoDB驱动程序代码连接,但无法编写?

为什么C#和MongoDB驱动程序代码连接,但无法编写?,c#,multithreading,mongodb,async-await,mongodb-.net-driver,C#,Multithreading,Mongodb,Async Await,Mongodb .net Driver,以下是有关我的开发环境的信息: Microsoft Visual Studio社区2015 .NET Framework 4.6 ASP.NET MVC assembly System.Web.MVC版本=5.2.3.0 MongoDB.Driver 2.0.1.27 Mongodb 3.0.6 在我的C#应用程序中,我有以下检索MongoDB数据库引用的代码: public class MongoDBConnectionManager { public IMongoDatabase

以下是有关我的开发环境的信息:

  • Microsoft Visual Studio社区2015
  • .NET Framework 4.6
  • ASP.NET MVC assembly System.Web.MVC版本=5.2.3.0
  • MongoDB.Driver 2.0.1.27
  • Mongodb 3.0.6
在我的C#应用程序中,我有以下检索MongoDB数据库引用的代码:

public class MongoDBConnectionManager {
    public IMongoDatabase getMongoDB() {
        var client = new MongoClient("mongodb://localhost:27017");
        MongoClient(System.Configuration.ConfigurationManager.ConnectionStrings["MongoDB"].ConnectionString);

        MongoServer.Create("Server=localhost:27017");
        IMongoCollection <BsonDocument> UserDetails = iMgDb.GetCollection<BsonDocument>("Users");

        return iMgDb;
    }
}
下面是使用Mongo DB连接管理器类的DAO C#类:

public class DAO {
    public async Task<int> insertNewUser(UserModel um) {
        MongoDBConnectionManager mgoDBCntMng = new MongoDBConnectionManager();

        IMongoDatabase database = mgoDBCntMng.getMongoDB();

        IMongoCollection <UserModel> UserDetails = database.GetCollection<UserModel>("Users");

        try {
            Task getTask = UserDetails.InsertOneAsync(um);
            await getTask;
        } catch(Exception) {
        }
        return 0;
    }
}
对于如何解决这个问题,我真的很困惑。我尝试使用DOS命令提示符搜索MongoDB错误日志,但没有显示错误。 从使用DOS命令提示符的MongoDB客户端,我得到以下信息:

C:\Program Files\MongoDB\Server\3.0\bin>mongo
MongoDB shell version: 3.0.6
connecting to: test
> use foo
switched to db foo
> db.runCommand( { getLastError: 1, w: 1, wtimeout:5000 } )
{
        "connectionId" : 6,
        "n" : 0,
        "syncMillis" : 0,
        "writtenTo" : null,
        "err" : null,
        "ok" : 1
}
我面临的问题是执行点运行平稳,但无法写入数据库。
在上述代码中使用async和wait的方式有什么问题


有人能告诉我如何纠正这个问题吗?

来自MSDN

等待运算符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成。这项任务是正在进行的工作

所以wait在任务完成之前会暂停或阻塞,所以我们只需创建多个任务,并确保在我们认为需要之前不会等待它,如果您正在处理插入集合的话

var tasks = new Task<//return type of UserDetails.InsertOneAsync(um)>[//get collection count here];
var count = 0;
foreach(// iterate collection here)
{
try {
            tasks[count] = UserDetails.InsertOneAsync(um); // adds continuations and return back immediately i.e. no blocking
            count++;
        } catch(Exception) {
    }
}
await Task.WhenAll(tasks.ToArray()); // here is where we block all tasks and wait for completion
var tasks=new Task[//在此处获取集合计数];
var计数=0;
foreach(//此处迭代集合)
{
试一试{
tasks[count]=UserDetails.InsertOneAsync(um);//添加延续并立即返回,即无阻塞
计数++;
}捕获(例外){
}
}
等待Task.whall(tasks.ToArray());//这里是我们阻止所有任务并等待完成的地方

注意:答案不准确,但会有点清楚我们正在做什么。这花了一段时间,但问题是因为我错误地将int基本数据类型用于UserModel中的ID而不是ObjectId

以下是UserModel的更正代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using WebApplication1.Models;
using MongoDB.Bson.Serialization.Attributes;

namespace WebApplication1.Models
{
    public class UserModel
    {

        [BsonId]
        public ObjectId ID { get; set; }

        [Required]
        [BsonElement]
        public string UserName { get; set; }

        [Required]
        [BsonElement]
        public string Password { get; set; }

        [Required]
        [BsonElement]
        public string Email { get; set; }

        [BsonElement]
        public string PhoneNo { get; set; }

        [BsonElement]
        public string Address { get; set; }
    }
}

getMongoDB函数代码存在一些问题:

  • 不需要两个连接,只使用一个
  • IMongoClient用于在Mongo.Driver 2.0.1.17中获取数据库。无需制作“MongoServer”
  • 不需要在“getMongoDB”函数中获取集合
下面是“getMongoDB”函数的代码:

     public IMongoDatabase getMongoDB() 
     {
        IMongoClient client = new MongoClient("mongodb://localhost:27017");
        var iMgDb = client.GetDatabase("Database Name Here");
        return iMgDb;
     }

希望这会有所帮助。

Thx,但我的代码已经与您的类似。根据,MongoDB.Driver的InsertOneAsync只返回一个任务对象。我的代码在任务数据类型为getTask的末尾等待getTask。但是,为什么它仍然挂起?@user1338998await应该阻止它,确保任务完成后再继续,你是说你的整个应用程序都冻结了?还是操作?FireFox浏览器选项卡只是显示它仍在处理,而Visual Studio 2015只是不断显示时间进度。基本上,应用程序只是一直在等待。没有东西会冻结,只是等待时间。您认为我的MongoDB配置/设置有问题吗?另外,请记住,我启动MongoDB数据库的DOS命令提示符中的日志显示正在连接数据库,但它无法显示对数据库的任何写入操作。但是,您是否仍然认为我的MongoDB配置/设置有问题?对不起,我的错误,MongoServer代码只是我在尝试连接后留下的一些代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using WebApplication1.Models;
using MongoDB.Bson.Serialization.Attributes;

namespace WebApplication1.Models
{
    public class UserModel
    {

        [BsonId]
        public ObjectId ID { get; set; }

        [Required]
        [BsonElement]
        public string UserName { get; set; }

        [Required]
        [BsonElement]
        public string Password { get; set; }

        [Required]
        [BsonElement]
        public string Email { get; set; }

        [BsonElement]
        public string PhoneNo { get; set; }

        [BsonElement]
        public string Address { get; set; }
    }
}
     public IMongoDatabase getMongoDB() 
     {
        IMongoClient client = new MongoClient("mongodb://localhost:27017");
        var iMgDb = client.GetDatabase("Database Name Here");
        return iMgDb;
     }