1

我正在尝试做一些我认为很容易但不知道如何在我的声明函数中写入标签的事情。

public static void StartProcessing(object data)
{

   lblError.Text = "Blah Blah"
}

我收到错误“非静态字段、方法或属性需要对象引用...”

因此,我尝试创建标签的新实例并将其添加到控件(面板)的新实例中,但未显示 lblError

  public static void StartProcessing(object data)
    {
       Panel Panel1 = new Panel();
       Label lblError= new Label();
       Panel1.Controls.Add(lblError);

       lblError.Visible = true;
       lblError.Text = "Blah Blah";

    }

必须有一个简单的方法来做到这一点?我忽略了..

该函数被调用如下:如果我将上面的内容更改为不是静态的,我会在下面的第二行收到一条错误消息,上面写着同样的“非静态字段、方法或属性需要对象引用...... " 当这个函数不是静态的?

public object LaunchNewProcess(object data)
{
ThreadPool.QueueUserWorkItem(
                new WaitCallback(ProcessStatuses.StartProcessing),
                new object[] {newProcess, allProcesses}
                );
4

2 回答 2

5

调用时将标签传递给静态函数:

public static void StartProcessing(object data, Label lblError)
{

   lblError.Text = "Blah Blah"
}

静态函数无权访问控件,因为控件属于页面(类)的实例

静态意味着类的所有实例共享相同的函数或变量。因此,类的实例可以访问静态变量或函数。然而,由于静态不“知道”类的任何实例,它不能访问实例的成员。实际上,静态方法或变量甚至不需要类的任何实例存在,那怎么可能呢?

正如其他人所提到的,从您的函数中删除static关键字也将起作用,但我假设您将其设为静态是有原因的。

编辑 好吧,这更复杂。

所以,你有一些类启动了一堆线程,如果出现问题,你希望它显示给用户?好吧,您当前的方法是有缺陷的,因为您无法在没有页面实例的情况下访问页面的控件。另外,我不确定这种方法如何适合页面生命周期。

您最好的方法(抱歉缺少代码,这在很大程度上取决于您的实现)可能是这样的:

//do this before you start spawning threads
List<bool> successes = new List<bool>();

ThreadPool.QueueUserWorkItem(
            new WaitCallback(ProcessStatuses.StartProcessing),
            new object[] {newProcess, allProcesses, successes}
            );

//you MUST wait for all your threads to complete before proceeding!
if(successes.Any(s => !s))
{
    //update your error label
}

public static void StartProcessing(object data, Label lblError)
{
    var dataArray = (object[3]) data;
    //if there is an error
    dataArray[2] = false;
}
于 2012-04-25T20:13:42.003 回答
2

你想要做的其实是相当困难的。

您想创建一个页面,启动一个异步任务,将页面发送给用户,然后在异步作业完成后更新页面上的内容。

问题是,当异步任务完成时,页面已经被发送,并且基于 HTTP 的工作方式,一旦你发送了响应,你就完成了;您无需与客户进行更多沟通。如果要更新它们,则需要等待客户端发送另一个请求。

这意味着您需要让 JavaScript 代码不断地轮询服务器,基本上询问“你完成了吗,你完成了吗,你完成了吗?” 直到最终服务器说,“是的,这是要在页面上显示的内容”。

幸运的是,您不需要从头开始。 在这里,您将找到 Microsoft 的一个示例,它可以完成所有这些操作;您可以修改它以满足您的需要。还值得一提的是,除了编程不简单之外,不断轮询服务器也会消耗大量资源,因此请确定您确实需要这样做。

选项 2 是不在新线程中启动其他任务,而是在页面返回给用户之前串行执行代码。他们会盯着空白屏幕一会儿,但编程会容易得多。如果任务真的长时间运行,这里要注意的一个缩小是超时。

于 2012-04-25T20:40:42.503 回答