async ctp今天早上我一直在玩,并有一个简单的程序与a button和a label.点击button它开始更新label,停止button它停止写入label.但是,我不确定如何重置,CancellationTokenSource以便我可以重新启动该过程.我的代码如下:
public partial class MainWindow : Window
{
CancellationTokenSource cts = new CancellationTokenSource();
public MainWindow()
{
InitializeComponent();
button.Content = "Start";
}
async Task DoWork(CancellationToken cancelToken)
{
int i = 0;
while (!cancelToken.IsCancellationRequested)
{
label.Content = i++.ToString();
await TaskEx.Delay(50, cancelToken);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (button.Content == "Start")
{
button.Content = "Stop";
DoWork(cts.Token);
}
else
{
button.Content = "Start";
cts.Cancel(); …Run Code Online (Sandbox Code Playgroud) c# asynchronous async-await cancellationtokensource cancellation-token
有人可以向我解释一下
dynamic_cast<SomeObject *>( &(*similarObject) );
Run Code Online (Sandbox Code Playgroud)
做取消引用指针的地址有什么意义?指针本身不是它的地址吗?
我有一个方法,使用后台工作程序轮询DLL的状态,如下所示:
var timeout = DateTime.Now.AddSeconds(3);
while (System.Status != Status.Complete // our status is not complete
&& DateTime.Now < timeout // have not timed out
&& !_Worker.CancellationPending) // backgroundworker has not been canceled
{
//Thread.Yield();
//Thread.SpinWait(1);
//Thread.Sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
当看着我的CPU%,yield()并spinwait()导致我的应用程序来拍摄高达50%,我的电脑上.随着Sleep(1)我的CPU%,6%,保持了下来.我被告知我应该选择Thread.Yield(),但是CPU%的高峰会让我感到困扰.什么是这样的最佳做法?
我正在为我在c#winforms中编写的游戏转换为wpf的聊天解析器,主要是为了更好地处理MVVM和wpf.这是我如何设置项目的故障
查看:现在它只是一个简单的ListBox,ItemSource绑定到我的viewmodels可观察聊天集合
型号:我有多个可以同时登录的角色,每个角色都有一个聊天类.聊天课开始一个后台工作人员从游戏中抓取和下一行聊天,并使用此行触发一个名为IncomingChat的事件.
public event Action<Game.ChatLine> IncomingChat;
Run Code Online (Sandbox Code Playgroud)
我正在使用后台工作人员在我的backgroundworkers progresschaged事件中触发事件,因为当我使用计时器时,我一直遇到线程问题.起初我通过将我的Timer更改为DispatchTimer来纠正这个问题,但是对我来说,在我的模型中使用DispatchTimer似乎并不合适.
ViewModel:由于我有多个字符,我正在创建多个ChatViewModel.我将一个字符传递给ChatViewModels构造函数并订阅Chat事件.我创建了一个ObservableColleciton来在收到此事件时保留我的聊天行.现在,当我尝试将我从聊天事件中收到的行添加到我的observablecollection时,我在viewModel上收到了一个线程问题.
我通过使我的viewmodels传入聊天事件处理程序看起来像这样来解决这个问题
public ObservableCollection<Game.ChatLine) Chat {get; private set;}
void Chat_Incoming(Game.ChatLine line)
{
App.Current.Dispatcher.Invoke(new Action(delegate
{
Chat.Add(line)
}), null);
}
Run Code Online (Sandbox Code Playgroud)
但这对我来说并不合适.虽然它有效,但在我的viewmodel中使用Dispatcher对我来说似乎不合适.
我现在对combobox感到有点沮丧,希望有人能回答我的问题.问题出在SelectedItem上.当我在调试器中运行我的应用程序时,如果我在ComboBox中输入匹配Item中的Item(即.. a,b或c)的文本,然后删除文本,它将抛出空引用异常.如果我在ComboBox中输入文本并且与项目中的项目(即.. z)不匹配,然后删除文本,则不会崩溃.此行为仅在调试器中发生.如果我在外面运行应用程序,我不会崩溃.我正在使用mvvmlight,但我不认为它与此有任何关系.我的代码如下
视图:
<ComboBox IsEditable="True"
VerticalAlignment="Top"
ItemsSource="{Binding Items}"
DisplayMemberPath="Name"
SelectedItem="{Binding Item,Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)
模型:
public class Item
{
public string Name { get; set; }
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
VM:
public MainViewModel()
{
Items = new List<Item>
{
new Item {Name="a", Id=0},
new Item {Name="b", Id=1},
new Item {Name="c", Id=2},
};
}
/// <summary>
/// The <see cref="Items" /> property's name.
/// </summary>
public const string ItemsPropertyName = "Items";
private List<Item> _items;
/// <summary>
/// Sets and …Run Code Online (Sandbox Code Playgroud) 我正在使用MVVM模式,并在运行我的应用程序时收到以下内容
InvalidOperationException TwoWay或OneWayToSource绑定不能对"ViewModel.SynergyViewModel"类型的只读属性"Options"起作用.
我在我的视图模型中评论了我的所有源代码,并将其追溯到复选框.如果我注释掉我的视图模型中的复选框或正确性,应用程序运行,减去功能.下面我列出了我的复选框的代码和viewmodel中的属性.
<CheckBox Grid.Column="4" HorizontalAlignment="Right" Margin="5,0,5,5" IsChecked="{Binding Options}" Content="Options"/>
Run Code Online (Sandbox Code Playgroud)
private bool _Options;
public bool Options
{
get
{
return _Options;
}
private set
{
if (_Options == value)
return;
_Options = value;
OnPropertyChanged("Options");
}
}
Run Code Online (Sandbox Code Playgroud)
发生System.InvalidOperationException Message = TwoWay或OneWayToSource绑定无法在"ViewModel.MyViewModel"类型的只读属性"Options"上工作.Source = PresentationFramework StackTrace:at MS.Internal.Data.PropertyPathWorker.CheckReadOnly(Object item,Object info)InnerException:
关于我在这里缺少什么的想法?
如何正确绑定动态创建的菜单项列表.我尝试了几件事,但似乎都没有效果.我得到了正确的名单,但我的ViewSwitchCommand似乎没有正确启动.
<MenuItem Foreground="White" Header="Names" ItemsSource="{Binding Player.ToonNames}" Command="{Binding ViewSwitchCommand}" CommandParameter="{Binding Header}"/>
Run Code Online (Sandbox Code Playgroud)
但是,如果我不动态地这样做,那么一切正常,可以让它工作
<MenuItem Foreground="White" Header="Names">
<MenuItem Foreground="Black" Header="Chat" Command="{Binding ViewSwitchCommand}" CommandParameter="player1" />
<MenuItem Foreground="Black" Header="Craft" Command="{Binding ViewSwitchCommand}" CommandParameter="player2" />
</MenuItem>
Run Code Online (Sandbox Code Playgroud)
命令参数需要一个字符串..不确定是不是它...希望这是一个简单的我只是忽略
我想知道何时使用TaskEx.Run.我提供了下面写的两个代码示例,它们产生相同的结果.我没有看到为什么我会采取Task.RunEx TaskEx.RunEx方法,我确信有一个很好的理由,并希望有人可以填补我.
async Task DoWork(CancellationToken cancelToken, IProgress<string> progress)
{
int i = 0;
TaskEx.RunEx(async () =>
{
while (!cancelToken.IsCancellationRequested)
{
progress.Report(i++.ToString());
await TaskEx.Delay(1, cancelToken);
}
}, cancelToken);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (button.Content.ToString() == "Start")
{
button.Content = "Stop";
cts.Dispose();
cts = new CancellationTokenSource();
listBox.Items.Clear();
IProgress<string> progress = new Progress<string>(s =>
{
listBox.Items.Add(s);
listBox.ScrollIntoView(listBox.Items[listBox.Items.Count - 1]);
});
DoWork(cts.Token, progress);
}
else
{
button.Content = "Start";
cts.Cancel();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样取得同样的结果
async Task DoWork(CancellationToken …Run Code Online (Sandbox Code Playgroud) 我一直在玩新的异步CTP和MVVM模式.我一直在使用后台工作程序转换我的旧程序并报告进度以更新模型中的集合.我把它改成了这样的东西
TaskEx.Run(async () =>
{
while (true)
{
// update ObservableCollection here
}
await TaskEx.Delay(500);
});
Run Code Online (Sandbox Code Playgroud)
在我看来,我绑定到我的viewmodel,它暴露了这个可观察的集合.但是,当我的集合更新时,我得到以下异常
这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection.
我不确定在这样做的时候拉回到UI线程的正确方法是什么.
我一直在查看几个背景工作者的例子,我遇到了类似于此的代码
public class MyClass
{
public MyClass()
{
using(BackgroundWorker _Worker = new BackgroundWorker { WorkerReportsProgress = true})
{
_Worker.DoWork += (s, args) =>
{
...
};
}
_Worker.RunWorkerAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有像我这样在代码中使用"使用"语句.我在使用Code Rush试用版时碰到了类似的东西,这让我回到这个代码并质疑我是否应该这样做.请帮助我了解是否/为什么这是最佳做法.谢谢.
c# ×8
wpf ×5
mvvm ×4
data-binding ×3
async-await ×2
async-ctp ×2
asynchronous ×2
c++ ×1
casting ×1
dynamic ×1
menuitem ×1
sleep ×1
using ×1
xaml ×1
yield ×1