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# 后台工作线程问题_C#_Multithreading_Backgroundworker - Fatal编程技术网

C# 后台工作线程问题

C# 后台工作线程问题,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我正在应用程序中使用后台工作程序 我的代码 void CreateThreadForEachServer() { DataAccess oDA = new DataAccess(); List<Server> allServerData = oDA.GetAllServers(); foreach (Server serverData in allServerData) { backgroundWorker = new Back

我正在应用程序中使用后台工作程序

我的代码

 void CreateThreadForEachServer()
 {
    DataAccess oDA = new DataAccess();

    List<Server> allServerData = oDA.GetAllServers();

    foreach (Server serverData in allServerData)
    {
        backgroundWorker = new BackgroundWorker();

        backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);

        backgroundWorker.RunWorkerAsync(serverData);

    }
}

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    Server server = (Server)e.Argument;
    CreateSnapshotForEachServer(server);
}

void CreateSnapshotForEachServer(Server server)
{
    DataAccess oDA = new DataAccess();
    MsmqMessageFormat message = new MsmqMessageFormat();

    try
    {
        message = new Queue().ReadMessageFromMSMQ(server.ServerName);
    }
    catch
    {
    }
 }
在后台工作程序中,我无法调用此方法,只能从MSMQ读取消息

但当我不能使用后台工作程序时,只需像这样在简单线程中调用此方法

void CreateThreadForEachServer()
{
    DataAccess oDA = new DataAccess();

    List<Server> allServerData = oDA.GetAllServers();

    foreach (Server serverData in allServerData)
    {
        ThreadStart t = delegate { CreateSnapshotForEachServer(serverData); };
        Thread td = new Thread(t);                
        td.Priority = ThreadPriority.Highest;
        td.Start();
    }
}
 class Queue
 {
     public MsmqMessageFormat ReadMessageFromMSMQ(string queueName)
     {
         MessageQueue messageQueue = null;

         messageQueue = new MessageQueue(@".\Private$\" + queueName);

         messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MsmqMessageFormat) });

         System.Messaging.Message msg = null;
         System.Messaging.Message[] allMessages = messageQueue.GetAllMessages();

         if (allMessages.Length > 0)
         {
             msg = messageQueue.Receive();

             MsmqMessageFormat readMessage = (MsmqMessageFormat)(msg.Body);

             return readMessage;
         }
         else
         {
             return null;
         }
     }
 }
[Serializable]
public class MsmqMessageFormat
{      
    public Zvol Zvol { get; set;}
    public List<PolicyInterval> listPolicyIntervalInfo = new List<PolicyInterval>(); 
}
后台工作者的问题是什么?我的队列类是这样的

void CreateThreadForEachServer()
{
    DataAccess oDA = new DataAccess();

    List<Server> allServerData = oDA.GetAllServers();

    foreach (Server serverData in allServerData)
    {
        ThreadStart t = delegate { CreateSnapshotForEachServer(serverData); };
        Thread td = new Thread(t);                
        td.Priority = ThreadPriority.Highest;
        td.Start();
    }
}
 class Queue
 {
     public MsmqMessageFormat ReadMessageFromMSMQ(string queueName)
     {
         MessageQueue messageQueue = null;

         messageQueue = new MessageQueue(@".\Private$\" + queueName);

         messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MsmqMessageFormat) });

         System.Messaging.Message msg = null;
         System.Messaging.Message[] allMessages = messageQueue.GetAllMessages();

         if (allMessages.Length > 0)
         {
             msg = messageQueue.Receive();

             MsmqMessageFormat readMessage = (MsmqMessageFormat)(msg.Body);

             return readMessage;
         }
         else
         {
             return null;
         }
     }
 }
[Serializable]
public class MsmqMessageFormat
{      
    public Zvol Zvol { get; set;}
    public List<PolicyInterval> listPolicyIntervalInfo = new List<PolicyInterval>(); 
}
MsmqMessageFormat类是这样的

void CreateThreadForEachServer()
{
    DataAccess oDA = new DataAccess();

    List<Server> allServerData = oDA.GetAllServers();

    foreach (Server serverData in allServerData)
    {
        ThreadStart t = delegate { CreateSnapshotForEachServer(serverData); };
        Thread td = new Thread(t);                
        td.Priority = ThreadPriority.Highest;
        td.Start();
    }
}
 class Queue
 {
     public MsmqMessageFormat ReadMessageFromMSMQ(string queueName)
     {
         MessageQueue messageQueue = null;

         messageQueue = new MessageQueue(@".\Private$\" + queueName);

         messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MsmqMessageFormat) });

         System.Messaging.Message msg = null;
         System.Messaging.Message[] allMessages = messageQueue.GetAllMessages();

         if (allMessages.Length > 0)
         {
             msg = messageQueue.Receive();

             MsmqMessageFormat readMessage = (MsmqMessageFormat)(msg.Body);

             return readMessage;
         }
         else
         {
             return null;
         }
     }
 }
[Serializable]
public class MsmqMessageFormat
{      
    public Zvol Zvol { get; set;}
    public List<PolicyInterval> listPolicyIntervalInfo = new List<PolicyInterval>(); 
}
[可序列化]
公共类MsmqMessageFormat
{      
公共Zvol Zvol{get;set;}
公共列表listPolicyIntervalInfo=新列表();
}

您能否澄清应用程序的上下文

它是Windows窗体应用程序吗?控制台应用程序?还是WPF


它可能与线程的apartmentstate有关。BackgroundWorker使用的线程默认为MTA(您不能覆盖它)。虽然手动创建的线程可以将apartmentstate设置为STA。

您能否澄清应用程序的上下文

它是Windows窗体应用程序吗?控制台应用程序?还是WPF


它可能与线程的apartmentstate有关。BackgroundWorker使用的线程默认为MTA(您不能覆盖它)。虽然手动创建的线程可以将there apartmentstate设置为STA。

我不确定您的方法是否正确。。我会一个接一个地阅读消息并绑定相应的事件

从链接:

消息循环

上面示例中的最后一行 是“queue.BeginReceive()”。这是一个 成功的关键线 microsoftmessage的实现 排队,因为它提供了方法 持续收听 消息队列。每次发送消息时 收到后,侦听过程停止。 这有助于提供线程安全 环境然而,这也意味着 开发人员有责任 继续收听队列

在问题的最后一段代码中:

if (allMessages.Length > 0)
        {

            msg = messageQueue.Receive();

            MsmqMessageFormat readMessage = (MsmqMessageFormat)(msg.Body);


            return readMessage;
        }
        else
        {
            return null;
        }

这将获取所有消息并使用它们,但即使队列中有多条消息,也只会返回第一条消息。

我不确定您的方法是否正确。。我会一个接一个地阅读消息并绑定相应的事件

从链接:

消息循环

上面示例中的最后一行 是“queue.BeginReceive()”。这是一个 成功的关键线 microsoftmessage的实现 排队,因为它提供了方法 持续收听 消息队列。每次发送消息时 收到后,侦听过程停止。 这有助于提供线程安全 环境然而,这也意味着 开发人员有责任 继续收听队列

在问题的最后一段代码中:

if (allMessages.Length > 0)
        {

            msg = messageQueue.Receive();

            MsmqMessageFormat readMessage = (MsmqMessageFormat)(msg.Body);


            return readMessage;
        }
        else
        {
            return null;
        }

这将获取所有消息并使用它们,但即使队列中有多条消息,也只会返回第一条消息。

实际上是多层应用程序BackgroundWorker进程在我的类库中,我在控制台应用程序中添加了此类库引用,并从控制台应用程序调用此进程。实际上,它是多层应用程序BackgroundWorker进程在我的类库中,我在我的控制台应用程序中添加了这个类库引用,并从控制台应用程序中调用这个进程,去掉这个GAWDT空的catch块,这样您就可以诊断问题了。如果没有帮助,请发布异常的堆栈跟踪。您遇到的实际问题是什么。当我从后台工作程序公共MsmqMessageFormat ReadMessageFromMSMQ(string queueName)调用方法时,不会调用此方法。请删除GAWD空捕获块,以便您可以诊断问题。如果没有帮助,请发布异常的堆栈跟踪。您遇到的实际问题是什么。当我从后台工作程序公共MsmqMessageFormat ReadMessageFromMSMQ(字符串队列名称)调用方法时,不会调用此方法