标签: compact-framework2.0

如何取消阻止在AutoResetEvent对象上调用WaitOne方法的线程?

下面是一个具有'SomeMethod'方法的类,它说明了我的问题.

class SomeClass
{
    AutoResetEvent theEvent = new AutoResetEvent(false);
    // more member declarations

    public void SomeMethod()
    {
        // some code
        theEvent.WaitOne();
        // more code
    }
}
Run Code Online (Sandbox Code Playgroud)

该方法设计为线程安全的,并将在不同的线程中调用.现在我的问题是如何在任何时间点取消阻止在'theEvent'对象上调用'WaitOne'方法的所有线程?这个要求经常出现在我的设计中,因为我需要能够优雅地停止和启动我的多线程程序.在我看来,启动一个多线程程序相当简单,但很难阻止它.

这是我迄今为止尝试过的,显然有效.但这是标准方法吗?

public void UnblockAll()
{
    do
    {
        theEvent.Set();
    } while (theEvent.WaitOne(0));
}
Run Code Online (Sandbox Code Playgroud)

'UnblockAll'方法是'SomeClass'类的成员.此处使用的技术基于WaitOne方法的MSDN文档.我引用下面文档的相关部分:

如果millisecondsTimeout为零,则该方法不会阻止.它测试等待句柄的状态并立即返回.

在do..while循环中,我调用Set方法.这释放了一个可能由于调用WaitOne方法而被阻塞的线程(在'SomeMethod'方法中编码).接下来,我测试'theEvent'对象的状态,只是为了知道它是否有信号.此测试是通过调用带有超时参数的WaitOne方法的重载版本来完成的.我在调用WaitOne方法时使用的参数为零,根据文档结果,调用立即返回一个布尔值.如果返回值是true,那么"theEvent"的对象信号状态中.如果在'SomeMethod'方法中对'WaitOne'方法的调用至少阻塞了一个线程,则调用'Set'方法(在'UnblockAll'方法中编码)将解除阻塞.因此,在'UnblockAll'方法中do..while语句结束时对'WaitOne'方法的调用将返回false.仅当没有线程被阻止时,返回值才为真.

上述推理是否正确,如果是正确的,该技术是否是处理我的问题的标准方法?我试图主要在.net compact-framework 2.0平台上使用该解决方案.

.net c# waithandle waitone compact-framework2.0

12
推荐指数
2
解决办法
2万
查看次数

System.Threading.Timer没有启动?

我正在使用C#和Compact Framework 2,SP2.

设备的操作系统设置为启动我的应用程序,让我们调用应用程序"Loader.exe".

Loader就是这样的:一个单一的,简单的形式,在整个加载过程中显示状态消息,如果有必要(存在错误和异常消息的外行术语,或者"启动应用程序[xyz]"),以及在后台运行的状态机同时显示基本的全屏形式.

所以装载机的形式的构造函数在下面非常结束:

try
{
    label1.Text = "Starting GUI Init Thread...";  //debug only message
    System.Threading.Timer guiInit = new System.Threading.Timer(
        RunStateMachine, null, 2000, System.Threading.Timeout.Infinite
        );
    //callback: RunStateMachine, null argument
    //initial callback is 2000ms from this point, and doesn't run again.
}
catch (Exception ex1)
{
    label1.Text = "GUI Init Error 2";
    Failure_Label.Text = ex1.Message;
}
Run Code Online (Sandbox Code Playgroud)

并且"RunStateMachine"确实在与UI不同的线程上工作,允许表单显示,并且任何时候RunStateMachine需要与表单交互,例如更新消息,我调用一个使用if(this.InvokeRequired){this的函数.Invoke(...);} else {...}

那么,我的问题呢?
间歇性地,我的程序将挂起,这是因为计时器没有触发回调.我在上面的try块中添加了调试消息,以及许多其他地方告诉我它挂在哪里,包括在"RunStateMachine"的非常开始的消息.最后,我的程序挂起了"正在启动GUI初始化线程......"的消息.

这告诉我,线程计时器没有运行的一个时间我需要它.
我的理论是它在定时器触发回调之前被垃圾收集.这意味着如果计时器是全局的,然后在我到达RunStateMachine时明确处理,它将完美运行......但我不想以为只是为了在一个月后间歇性地发现这个问题.

思考?

c# timer hang compact-framework2.0

5
推荐指数
1
解决办法
2636
查看次数

使用C#compact 2.0获取Windows CE 5.0中的当前目录

如何获取运行EXE的当前目录?我尝试了以下两个代码,但它们不起作用.

Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
Run Code Online (Sandbox Code Playgroud)

使用上面我得到错误"名称"程序集"不存在......"

Directory.GetCurrentDirectory()
Run Code Online (Sandbox Code Playgroud)

也行不通.

编辑
确定我发现另一个代码可以工作,但它给我目录"\ Windows",但我的程序是从SD卡运行.我将程序复制到设备上的"Program Files"文件夹,但它再次给了我目录"\ Windows".

如何获取当前目录或更具体地说明如何获取SD卡/闪存路径?

compact-framework windows-ce compact-framework2.0

4
推荐指数
1
解决办法
6925
查看次数

查找文件夹中具有相同名称但扩展名不同的文件

我有一个FTP服务器,存储客户端在某个文件夹中发送/上传的文件.客户端将上传3个具有相同名称但扩展名不同的文件.例如,客户端将发送file1.ext1,file1.ext2和file1.ext3.我正在寻找一段代码,它将帮助我找到具有相同名称的文件("file1")然后压缩它们.任何帮助表示赞赏.我编写了这段代码,它获取了文件夹中所有文件的名称:

string path = "somepath";
String[] FileNames = Directory.GetFiles(path);
Run Code Online (Sandbox Code Playgroud)

.net c# file-io compact-framework2.0

3
推荐指数
2
解决办法
6544
查看次数