C# 等待一个值为真,需要线程吗?

C# 等待一个值为真,需要线程吗?,c#,multithreading,C#,Multithreading,我写了一个小方法。它基本上调用服务(而不是web服务)来设置锁属性。它确实有效,但我有兴趣改进它。我真的应该在一个新的线程中运行这个吗 我在一个do..while中运行这个,我没有线程。在调用之间睡眠 我正在用秒表记录实际超过20秒的时间,我退出,因为无法设置锁 public bool ObtainLock(Uri lockUri) { bool lockResult = false; var sw = new Stopwatch(); sw.Start();

我写了一个小方法。它基本上调用服务(而不是web服务)来设置锁属性。它确实有效,但我有兴趣改进它。我真的应该在一个新的线程中运行这个吗

我在一个
do..while
中运行这个,我没有
线程。在调用之间睡眠

我正在用秒表记录实际超过20秒的时间,我退出,因为无法设置锁

public bool ObtainLock(Uri lockUri)
{
    bool lockResult = false;

    var sw = new Stopwatch();
    sw.Start();
    do
    {
        lockResult = myService.SetLockBit(lockUri);
    }
    while (!lockResult || sw.ElapsedMilliseconds >= 20000);

    sw.Stop();

    return lockResult;
}
在我看来,这是可以改进的,线程让我担心。注意,myservice不是web服务,它只是类上的另一个方法,因此我可以在这里使用
Task


我正在使用的秒表,这是实现超时的一种可接受的方式吗?

如果这是您的UI线程,我会这么做。也许一个
计时器会更好?也许您应该使用
自旋锁

如果这可以改进,则取决于正在发生的事情。您是否应该为此生成一个新线程?如果在等待
SetLockBit
时需要当前线程执行其他操作(例如UI更新),则选择“是”。如果您不需要当前线程来执行任何操作,那么这很好


秒表很好。但是,如果您知道锁一次可能会保持几秒钟,则可能需要等待更长的时间才能再次调用
SetLockBit
。如果您知道它们很快就发布了,但是存在很多争用,那么您可能希望保留它。

如果您使用的是.NET 4,您可以使用c#任务库来解决这个问题,您确定它不可用吗?什么是
SetLockBit
?它在干什么?在不知道它应该做什么的情况下,我们对调用者没有什么可说的。它是在顺序文件中写入一行。。不理想。但我必须和它一起工作!也许你的问题是“如何使用异步web和文件I/O API?”@Martin我们需要知道更多。如果它是一个正确实现的异步操作,那么它应该有一些在“完成”时公开的方法,无论是事件、回调、任务还是您所拥有的。如果没有,那么理想情况下,您应该更改方法以向其添加这样的机制。如果这些都不存在或不可能,那么就真的没有什么可以做的了。