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(字符串队列名称)调用方法时,不会调用此方法