我正在寻找一种方法来替换这个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中,这是线程安全的。
非常感谢您建议更好地实施此代码。
谢谢
答案 0 :(得分:1)
您可以使用计时器来摆脱while
和thread.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
答案 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;
}
}
}