线程障碍问题

时间:2014-01-20 05:12:29

标签: c# multithreading asynchronous

我遇到一种情况,我需要一个线程等待,直到另一个线程为其提供数据。我创建了这个课程:Propery Highlighted,Syntax Highlighted Version

public class AsyncObjectWait<T1, TriggerType>
{
    private void _timeout(TimeSpan timeout, TaskCompletionSource<TriggerType> tcs)
    {
        System.Threading.Thread.Sleep(timeout);
        lock (tcs)
        {
            if (!tcs.TrySetException(new TimeoutException("Wait Timed Out")))
            {
                int a = 0;
            }
            else
            {
                Console.WriteLine("Timed Out");
            }
        }
    }
    public Task<TriggerType> WaitOneAsync(TimeSpan timeout)
    {
        TaskCompletionSource<TriggerType> wait = new TaskCompletionSource<TriggerType>();
        lock (_waits)
        {
            _waits.Enqueue(wait);
            Task.Run(() =>
            {
                _timeout(timeout, wait);
            });
        }
        return wait.Task;
    }
    public bool TrySetOne(TriggerType trigger, Converter<TriggerType, T1> converter)
    {
        TaskCompletionSource<TriggerType> wait;
        bool set = false;
        lock (_waits)
        {
            while ((!set) && (!(_waits.Count == 0))) //while we havent completed a task, and as long as we have some more to check.
            {

                ; //get the next wait.
                lock (_waits.Peek()) //wait for any other threads to stop using the next wait it, then get exclusive access.
                {
                    wait = _waits.Peek();
                    if (EqualityComparer<T1>.Default.Equals(converter(trigger), _value))
                    {
                        set = wait.TrySetResult(trigger); //try and set the result to complete the task. if we cant, try the next task

                        _waits.Dequeue();
                        if (!set)
                        {
                            continue;
                        }
                        else
                        {
                            return true;
                        }
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            return false;
        }
    }
}

要做到这一点,还要提供一个基于任务的界面,它在等待时不会冻结我的UI。 但这似乎有一个问题。调用Recieve()方法时,WaitFor生成的任务可能需要一秒钟才能收到完成信息。我无法找到理由。

这可能是由于异步方法开销造成的吗?还有另一种不那么复杂的方法吗?

0 个答案:

没有答案