从静态函数写入标签

时间:2012-04-25 20:11:01

标签: c# asp.net

我正在尝试做一些我认为很容易但却无法弄清楚如何在我的陈述函数中写入标签的事情。

public static void StartProcessing(object data)
{

   lblError.Text = "Blah Blah"
}

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

所以我尝试创建标签的新实例并将其添加到控件的新实例(Panel)但是没有显示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}
                );

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

你想要做的事实上很难。

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

问题在于,异步任务完成后页面已经发送,并且基于HTTP发送响应的方式,您已完成响应;没有更多的客户与您沟通。如果要更新请求,则需要等待客户端发送另一个请求。

这意味着你需要拥有不断轮询服务器的JavaScript代码,基本上会问:“你还没完成,你还没完成,你做完了吗?”直到最终服务器说:“是的,这是在页面上显示的东西”。

幸运的是,您无需从头开始。 Here你会找到一个微软的例子来做所有这些事情;你可以修改它以满足你的需要。还值得一提的是,除了对程序不重要之外,它还会消耗大量资源来不断轮询服务器,因此请确保您确实需要这样做。

选项2是不在新线程中启动其他任务,并在页面返回给用户之前连续执行代码。他们会暂时盯着空白屏幕,但编程起来会更容易。如果任务真的长时间运行,那么要注意这里的缩小是超时的。