如何避免Winform服务总线消息接收机出现跨线程操作无效的异常

问题描述 投票:0回答:0

开发了一个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中的信息如图所示。列表框!)

c# winforms azure exception servicebus
© www.soinside.com 2019 - 2024. All rights reserved.