【问题标题】:Static variables generating problems with C# (Windows 8)使用 C# (Windows 8) 生成问题的静态变量
【发布时间】:2012-11-20 19:41:23
【问题描述】:

我不是一个用过的 C# 程序员,所以如果这是愚蠢的,对不起:-)

我正在为 Windows 8 开发 C# 应用程序。我需要执行 Web 请求,因此,我有一个回调来处理请求数据。

我使用的是标准方法:

private static ManualResetEvent allDone = new ManualResetEvent(false);

private static void daCallback(IAsyncResult data) {
   ...
   SampleDataSource.allDone.Set();
}

// This is the Class CONSTRUCTOR
public SampleDataSource() {
   # before anything, reset allDone:

  string request = "http://some.url.com";
  HttpWebRequest webRequest = WebRequest.Create(request) as HttpWebRequest;
  webRequest.Method = "POST";

  webRequest.BeginGetResponse(new AsyncCallback(daCallback), webRequest);

  Debug.WriteLine("Asked to begin get response");

  SampleDataSource.allDone.WaitOne(12000);

  Debug.WriteLine("Done Waiting");
   #...
}

运行时,allDone(do_something 内部)未初始化。我什至添加了一个条件来比较 allDone 和 null,是的,它是 null。

“等待完成”消息永远不会被打印出来......

我做错了什么?

谢谢

【问题讨论】:

  • 为什么需要重置事件? (您确定某处的其他代码没有将其设置为 null 吗?从您在此处发布的代码来看,它不应该是……)
  • 你首先应该做什么
  • @Cameron,不管我是调用 Reset、set 还是 WaitOne。它没有定义。为什么?
  • @ambs 也许你还有一些其他变量/属性等命名为 allDone ?
  • 只有这些对 allDone 的引用才是这个命名空间/类。

标签: c# variables asynchronous static manualresetevent


【解决方案1】:

您正在从实例方法调用静态字段。请改用YourClassName.allDone.Reset()

【讨论】:

    【解决方案2】:

    您必须在调用allDone 之前添加类名,因为它是静态的。 所以不是

    allDone.Reset();
    

    试试

    //replace CLASS with whatever you named your class
    CLASS.allDone.Reset();
    

    所有其他调用的等效方法。

    【讨论】:

    • 这就解释了一切。但它似乎仍然是一个空值。
    • @ambs 您是否尝试在private static ManualResetEvent allDone = new ManualResetEvent(false); 设置断点?这样您就可以确定它是否真的被调用(并且之后 allDone 不为空)。
    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多