2012-04-25 24 views
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} 
       ); 
+7

为什么你的方法是静态的?这就是问题所在...... – 2012-04-25 20:12:33

+0

现在我明白你是如何调用你的函数的,你希望实现什么? – SouthShoreAK 2012-04-25 20:30:02

+0

如果其中一个进程不成功,我只想向用户显示错误消息(我认为是在标签中)。 – user1186144 2012-04-25 20:31:28

回答

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; 
} 
+0

该功能是从类文件(.cs)中调用的,该文件不是具有标签的表单的一部分!所以不确定我能否以这种方式通过标签? – user1186144 2012-04-25 20:22:02

+1

哦。这在几个层面上是个问题。如果另一个类正在调用此函数,而没有页面实例,那么您的标签始终为空。你可能想要发布你的源代码,因为它听起来像你可能已经转错了方向。 – SouthShoreAK 2012-04-25 20:24:48

+0

如果您等待异步任务在该庄园中完成,那么用户坐在一个空白屏幕上,直到完成所有工作。这违背了使任务异步的目的,你可能只是在现有的线程中串行地执行。请参阅我的答案 – Servy 2012-04-25 20:48:00

2

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

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

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

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

幸运的是,您不需要从头开始。 Here你会发现微软的一个例子,它可以完成所有这些工作;你可以修改它以适应你的需求。另外值得一提的是,除了不重要的程序外,它还会消耗大量资源来持续轮询服务器,所以请确保您确实需要这样做。

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

+0

他也可以等待所有线程完成,然后再从服务器。好的解释,但。 – SouthShoreAK 2012-04-25 20:47:36

+0

@SouthShoreAK当我评论你的回答时,如果你这样做了,为什么还要开始另一个线程呢?尽管我将这个选项编辑到了这个答案中。 – Servy 2012-04-25 20:49:50

+0

@SouthShoreAK哦,并且当我坚持我的回答时,如果您等待任务,客户端可能会超时。 – Servy 2012-04-25 20:51:48