这是我提出的第一个问题,所以如果我做错了,请宽容。
我正在编写一个软件来从串口读取数据,然后使用它来更新静态对象列表的状态。我收到的每个数据都是无线节点的通信,它代表了它的状态。我解决了阅读部分,我正在处理搜索和更新部分。
我想使用后台工作程序搜索列表中的元素,然后更新它,确保用户获得干净,流畅的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;
并通过工具箱添加它,但结果是一样的。
答案 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);