C# 从静态函数写入标签
我正在尝试做一些我认为很简单的事情,但不知道如何在stating函数中写入标签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)
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是不在新线程中启动其他任务,而是在页面返回给用户之前连续执行代码。他们会在一个空白屏幕上呆上一段时间,但编程会容易得多。这里要注意的一点是,如果任务运行时间很长,则会出现超时。您想做的事情实际上相当困难 您希望创建一个页面,启动一个异步任务,将页面发送给用户,然后在异步作业之后更新页面上的内容