Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从静态函数写入标签_C#_Asp.net - Fatal编程技术网

C# 从静态函数写入标签

C# 从静态函数写入标签,c#,asp.net,C#,Asp.net,我正在尝试做一些我认为很简单的事情,但不知道如何在stating函数中写入标签 public static void StartProcessing(object data) { lblError.Text = "Blah Blah" } 我得到错误“非静态字段、方法或属性需要对象引用…” 因此,我尝试创建标签的新实例,并将其添加到控件(面板)的新实例中,但lblError没有显示出来 public static void StartProcessing(object data)

我正在尝试做一些我认为很简单的事情,但不知道如何在stating函数中写入标签

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}
                );

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

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

   lblError.Text = "Blah Blah"
}
静态函数无权访问控件,因为控件属于页面(类)的实例

静态表示一个类的所有实例共享相同的函数或变量。因此,类的实例可以访问静态变量或函数。但是,由于static不“知道”类的任何实例,因此它无法访问实例的成员。事实上,静态方法或变量甚至不需要类的任何实例存在,那么它怎么可能存在呢

从函数中删除
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;
}
//在开始生成线程之前执行此操作
列表成功=新列表();
ThreadPool.QueueUserWorkItem(
新的WaitCallback(ProcessStatuses.StartProcessing),
新对象[]{newProcess,allprocesss,successfulls}
);
//您必须等待所有线程完成后才能继续!
if(successfuls.Any(s=>!s))
{
//更新错误标签
}
公共静态void启动处理(对象数据、标签lblError)
{
var dataArray=(对象[3])数据;
//如果有错误
dataArray[2]=false;
}

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

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

   lblError.Text = "Blah Blah"
}
静态函数无权访问控件,因为控件属于页面(类)的实例

静态表示一个类的所有实例共享相同的函数或变量。因此,类的实例可以访问静态变量或函数。但是,由于static不“知道”类的任何实例,因此它无法访问实例的成员。事实上,静态方法或变量甚至不需要类的任何实例存在,那么它怎么可能存在呢

从函数中删除
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;
}
//在开始生成线程之前执行此操作
列表成功=新列表();
ThreadPool.QueueUserWorkItem(
新的WaitCallback(ProcessStatuses.StartProcessing),
新对象[]{newProcess,allprocesss,successfulls}
);
//您必须等待所有线程完成后才能继续!
if(successfuls.Any(s=>!s))
{
//更新错误标签
}
公共静态void启动处理(对象数据、标签lblError)
{
var dataArray=(对象[3])数据;
//如果有错误
dataArray[2]=false;
}

你想做的事情其实很难

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

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

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

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


选项2是不在新线程中启动其他任务,而是在页面返回给用户之前连续执行代码。他们会在一个空白屏幕上呆上一段时间,但编程会容易得多。这里要注意的一点是,如果任务运行时间很长,则会出现超时。

您想做的事情实际上相当困难

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