开发了一个Azure服务总线消息接收机控制台应用,目前运行正常。控制台应用
控制台应用程序的代码如下。
using Microsoft.ServiceBus.Messaging;
using System;
using System.IO;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
const string connectionString = "Endpoint=sb://sbusnsXXXX.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=bkjk3Qo5QFoILlnay44ptlukJqncoRUaAfR+KtZp6Vo=";
const string queueName = "bewtstest1";
var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName);
try
{
queueClient.OnMessage(message =>
{
string body = new StreamReader(message.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
Console.WriteLine(body);
message.Complete();
});
Console.ReadLine();
}
catch (Exception ex)
{
queueClient.OnMessage(message =>
{
Console.WriteLine(ex.ToString());
message.Abandon();
});
Console.ReadLine();
}
}
}
}
我试图将其转换为Winform应用程序,以便在listBox中以字符串形式显示服务总线消息。 已经用控制台应用代码创建了一个新的Class(Azure),并在主窗体中调用该方法。
类Azure
using System;
using System.IO;
using System.Text;
using Microsoft.ServiceBus.Messaging;
namespace BewtsTest1
{
public class Azure
{
public static void GetQueue(Form1 form)
{
const string connectionString = "Endpoint=sb://sbusnsXXXX.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=bkjk3Qo5QFoILlnay44ptlukJqncoRUaAfR+KtZp6Vo=";
const string queueName = "bewtstest1";
var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName);
try
{
queueClient.OnMessage(message =>
{
string body = new StreamReader(message.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
//Form1 f = new Form1();
form.listBox1.Items.Add(body);
Console.WriteLine(body);
message.Complete();
});
Console.ReadLine();
}
catch (Exception ex)
{
queueClient.OnMessage(message =>
{
Console.WriteLine(ex.ToString());
message.Abandon();
});
Console.ReadLine();
}
}
主要形式:
namespace BewtsTest1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Azure.GetQueue(this);
}
}
}
代码编译后,当收到一个新的服务总线消息时,我得到了以下异常。
System.InvalidOperationException: '跨线程操作无效。控件'listBox1'从线程以外的线程访问,而不是在该线程上创建。例外剪裁
有什么办法可以避免这个异常(注意,我已经尝试过使用InvokeRequired,但无法让代码编译)? 谢谢!
(感觉我已经很接近了,因为当我停止并重新运行程序时,表单加载的时候,listBox中的信息如图所示。列表框!)