从静态方法调用BackgroundWorker

时间:2014-01-27 12:00:33

标签: c# visual-studio backgroundworker static-methods

这是我提出的第一个问题,所以如果我做错了,请宽容。

我正在编写一个软件来从串口读取数据,然后使用它来更新静态对象列表的状态。我收到的每个数据都是无线节点的通信,它代表了它的状态。我解决了阅读部分,我正在处理搜索和更新部分。

我想使用后台工作程序搜索列表中的元素,然后更新它,确保用户获得干净,流畅的UI。问题是我通过静态函数读取字节,从静态函数我应该调用后台工作来执行任务。我在dotnetperls指南上读到“可以在代码中的任何地方调用RunWorkerAsync。”但是当我尝试从静态函数调用它时,Visual Studio不允许我这样做。

任何人都可以帮助我吗?

[编辑:已添加代码] 这是我的静态方法的摘录:

public static void Add(Byte[] received)
{
    List<byte[]> messages = new List<byte[]>();
    int lastdollars = 0;
    byte[] tempmess = new byte[20];     //The message is 20 digits
    lock (BufferLock)
    {
        //I add the last bytes to the buffer (it's a list of bytes)
        Buffer.AddRange(received);
        if (Buffer.Count < TOTALMESSAGELENGTH) return;
        String temp = Encoding.UTF8.GetString(Buffer.ToArray());
        //I check the buffer to look for complete messages (there are tokens at the start and at the end
        for (int i = 0; i <= (temp.Length - TOTALMESSAGELENGTH + 1); i++)           
        {
            if ((temp.Length > i + TOTALMESSAGELENGTH) &&
                (temp.Substring(i, TOKENLENGTH) == STARTTOKEN) &&
                (temp.Substring((i + TOKENLENGTH + MESSAGELENGTH), TOKENLENGTH) == ENDTOKEN))
            {
                //if I find a message, I put it into the list of messages, I save its position and I continue to look for other messages
                tempmess = Encoding.UTF8.GetBytes(temp.Substring(i, TOTALMESSAGELENGTH));
                messages.Add(tempmess);
                lastdollars = i;
                i += TOTALMESSAGELENGTH - 1;
            }
        }
        if (messages.Count == 0) 
            return;

        //I delete the buffer that I'm using and I need to call the background worker
        Buffer.RemoveRange(0, (lastdollars + TOTALMESSAGELENGTH));
    }
    worker.RunWorkerAsync(messages);    //Error: An object is required for the non-static field, method, or property 'namespace.Form1.worker'
}

我尝试用以下方法手动定义backgroundworker:

private readonly BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;

并通过工具箱添加它,但结果是一样的。

2 个答案:

答案 0 :(得分:1)

您无法在静态方法中访问实例变量。因此错误。尝试将BackgroundWorker实例设置为静态。如下所示。

    private readonly static BackgroundWorker worker = new BackgroundWorker();

不确定这是否会破坏您的任何其他代码。

希望这有帮助。

答案 1 :(得分:0)

这与BackgroundWorker或任何特定类没有任何关系。这就是C#语言的工作原理。

您无法从静态功能访问非静态成员。静态函数没有隐式this参数,使其针对类的特定实例运行。您可以在不创建类的任何实例的情况下运行它。

这名工人

private readonly BackgroundWorker worker = new BackgroundWorker();

将为每个类的实例创建一次。但是你可以在没有任何实例的情况下调用Add函数。

例如,出于同样的原因,这不起作用:

class Adder
{
    public int sum = 0;

    public static void Add(int x)
    {
        sum += x; // can't reference "sum" from static method! 
    }
}

...

Adder.Add(5)

但这有效:

class Adder
{
    public int sum = 0;

    public void Add(int x) // no longer static
    {
        sum += x; // this refers to the "sum" variable of this particular instance of Adder
    }
}

...

var adder = new Adder();
adder.Add(5);

这也有效(但不同!):

class Adder
{
    public static int sum = 0; // we made sum static (there is exactly one, instead of a separate sum for each instance)

    public static void Add(int x)
    {
        sum += x; // this refers to the static sum variable
    }
}

...

Adder.Add(5);