Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确使用第三方物流/任务,了解流程_C#_Wpf - Fatal编程技术网

C# 正确使用第三方物流/任务,了解流程

C# 正确使用第三方物流/任务,了解流程,c#,wpf,C#,Wpf,完全是TPL/Asynchonrous编程的初学者,但我正在努力完成我正在做的事情 我有一个任务调用一个方法,该方法应继续运行,直到“地址”不为空。 一旦Address有一些非空值,理想情况下我想创建一个新的窗口实例,然后 使其对用户可见 我可以让任务按我希望的方式运行(每5秒一次),但我不知道如何运行 一旦此操作完成,我可以向用户显示一个新窗口,如果该表单上没有“确认”,请重新启动“查找”过程 到目前为止,我对使用任务的程序流感到特别困惑,但我试图实现的/到目前为止我得到的代码如下: 目标:

完全是TPL/Asynchonrous编程的初学者,但我正在努力完成我正在做的事情

我有一个任务调用一个方法,该方法应继续运行,直到“地址”不为空。 一旦Address有一些非空值,理想情况下我想创建一个新的窗口实例,然后 使其对用户可见

我可以让任务按我希望的方式运行(每5秒一次),但我不知道如何运行 一旦此操作完成,我可以向用户显示一个新窗口,如果该表单上没有“确认”,请重新启动“查找”过程

到目前为止,我对使用任务的程序流感到特别困惑,但我试图实现的/到目前为止我得到的代码如下:

目标:

  • 执行FindHeaddress,直到_profile.Address不再为空
  • 创建某个WPF窗口的实例并使其可见
  • 加载窗口后,用户必须确认地址正确
  • 未能确认我们再次开始“FindAddress”以找到其他匹配项
为了尝试解释,我的代码简化如下:

Task.Factory.StartNew(() => SomeClass.SomeMethod(TimeSpan.FromSeconds(5), ts1.Token));
方法:

public async void FindAddress(TimeSpan interval, CancellationToken token)
{
    while (_profile.Address == null)
    {     
            //FindTheAddress in reality makes an API request (EWS)
            _profile.Address = FindTheAddress();

            if (interval <= TimeSpan.Zero) return;
            await Task.Delay(interval, token);
    }
  //This throws some nasty STA issue I don't really understand.
  (new SomeWindow()).Activate();
}
public异步void FindAddress(时间跨度间隔,取消令牌)
{
while(_profile.Address==null)
{     
//FindHeaddress实际上发出API请求(EWS)
_profile.Address=FindTheAddress();

如果(interval我认为这里根本不需要背景线程,除非
findtheadress
是CPU密集型的(我无法想象会是这样)

因此,您可以使用常规的
异步
/
等待
。您应该(正如我在MSDN文章中所描述的那样)。这意味着您的工作方法如下所示:

public async Task FindAddressAsync(TimeSpan interval, CancellationToken token)
{
  while (_profile.Address == null)
  {     
    _profile.Address = FindTheAddress();

    if (interval <= TimeSpan.Zero) return;
    await Task.Delay(interval, token);
  }
}

如果没有完整的代码示例,这里真的不清楚需要什么。但是以下版本的
FindAddress(TimeSpan,CancellationToken)
方法中没有任何会阻塞的内容,因此即使您从UI线程调用它,它也保证工作(您应该这样做):

公共异步任务FindAddress(时间跨度间隔,取消令牌)
{
while(_profile.Address=wait Task.Run(()=>findtheadress())==null)
{     

if(interval)您不应该启动新的
任务
来运行
FindAddress()
方法。只需从UI线程调用它(例如,响应按钮
单击事件处理程序等)。如果你想得到一个解释如何调整代码以使其正确的答案,请发布一个完整的代码示例。请看,我最初是这样做的,但我的UI因此每5秒就没有响应。我的应用程序中的“FindAddress”真正做的是在后台运行,并在找到我想要的“地址”后查找“地址”打开一个新窗口->等待x时间量->在x时间量过去之后->继续查找地址。不,不使用您在此处发布的代码。除非无参数
findHeaddress()
方法本身每次调用都需要5秒钟。这就是为什么您需要发布一个完整的代码示例。此代码要求是反应式的。请参阅。我可以想象它是这样的:
addressChanges.Throttle(interval)。Select(FindHeadAddress)。Switch().Subscribe(ShowWindow)
。我从未听说过反应式扩展,我会看一看,感谢您的洞察力。FindAddress在实际上下文中执行Exchange Web服务API调用并搜索地址,很抱歉,我可能在最初的问题中提到了这一点。
await FindAddressAsync(TimeSpan.FromSeconds(5), ts1.Token);
(new SomeWindow()).Activate();
public async Task FindAddress(TimeSpan interval, CancellationToken token)
{
    while ((_profile.Address = await Task.Run(() => FindTheAddress())) == null)
    {     
            if (interval <= TimeSpan.Zero) return;
            await Task.Delay(interval, token);
    }
  //This throws some nasty STA issue I don't really understand.
  (new SomeWindow()).Activate();
}