如何在这个C#示例中避免while(true)

时间:2017-04-26 18:22:39

标签: c# multithreading events monitor

我正在寻找一种方法来替换这个while循环,并使用更有效的东西,例如事件驱动的代码。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:id="@+id/itemname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="19dp"
        android:layout_marginTop="22dp"
        android:text="TextView"
        android:textSize="14sp"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/productimage" />

    <ImageView
        android:id="@+id/productimage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="21dp"
        app:srcCompat="@drawable/common_full_open_on_phone"
        android:layout_alignTop="@+id/itemname"
        android:layout_alignParentStart="true" />

</RelativeLayout>

可以在其他线程中删除单位,它们在concurrentDictionary中,这是线程安全的。

非常感谢您建议更好地实施此代码。

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用计时器来摆脱whilethread.sleep,同时还可以消除主线程上的阻塞:

private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
    if(unitsCount < 10)
    {    
        //launch Units
    }
 }

public static void Main (string[] args) 
{
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed+=new System.Timers.ElapsedEventHandler(OnTimedEvent);

    aTimer.Interval=100;
    aTimer.Enabled=true;
}

工作示例:fiddle

Timer Documentation

Related Answer

答案 1 :(得分:1)

这是我使用Event创建的一个示例,它显然不完整,但您应该能够添加所需内容以获得它想要的效果。

当从中删除密钥时,它会检查字典的计数,然后在计数小于指定的数量时触发事件。

注意:我不知道这是否是线程安全的,我不熟悉使用线程,我希望ConcurrentDictionary能够解决这个问题。

public static partial class Program 
{
    static void Main(string[] args)
    {
        DictionaryCount<int, string> dict = new DictionaryCount<int, string>();
        dict.CountLessThan += dict_TryRemove;
        dict.CountToFireOn = 1;
        dict.TryAdd(1, "hello");
        dict.TryAdd(2, "world");
        dict.TryAdd(3, "!");
        string outValue;
        dict.TryRemove(2, out outValue);
        dict.TryRemove(1, out outValue);
        Console.ReadKey(true);
    }

    private static void dict_TryRemove(object sender, CountEventArgs e)
    {
        DictionaryCount<int, string> dict = sender as DictionaryCount<int, string>;
        Console.WriteLine(dict.Count);
        Console.WriteLine("Count less than 2!");
    }

    public class DictionaryCount<TKey, TValue> : ConcurrentDictionary<TKey, TValue>
    {
        public int CountToFireOn { get; set; }

        public DictionaryCount() : base() { }

        public delegate void CountEventHandler(object sender, CountEventArgs e);
        public event CountEventHandler CountLessThan;

        public new bool TryRemove(TKey key, out TValue value)
        {
            bool retVal = base.TryRemove(key, out value);
            if (this.Count <= CountToFireOn)
            {
                CountEventArgs args = new CountEventArgs(this.Count);
                CountLessThan(this, args);
            }
            return retVal;
        }
    }

    public class CountEventArgs
    {
        public int Count { get; set; }

        public CountEventArgs(int count)
        {
            this.Count = count;
        }
    }
}