Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# Silverlight工作线程在完成工作后应该做什么?_C#_Multithreading_Silverlight_Windows Phone 7_Asynchronous - Fatal编程技术网

C# Silverlight工作线程在完成工作后应该做什么?

C# Silverlight工作线程在完成工作后应该做什么?,c#,multithreading,silverlight,windows-phone-7,asynchronous,C#,Multithreading,Silverlight,Windows Phone 7,Asynchronous,这就是我的Windows Phone应用程序的问题。 我有第1页可以导航到第2页。在第2页OnNavigateTo中,我进行了一个异步调用。 这在我第一次运行应用程序时似乎还可以,异步调用创建了一个新的工作线程,并为我工作,这很酷但是我意识到,如果我返回到第1页并重新调用第2页,问题就会出现:现在我从异步调用中获得了一个新的工作线程,而旧的工作线程没有终止。因此,两个工作线程之间存在争用,这会给我的应用程序带来问题我无法直接控制线程,因为它们是由异步方法隐式创建的 因此,在这种情况下,是否有人对

这就是我的Windows Phone应用程序的问题。
我有第1页可以导航到第2页。在第2页
OnNavigateTo
中,我进行了一个异步调用。
这在我第一次运行应用程序时似乎还可以,异步调用创建了一个新的工作线程,并为我工作,这很酷
但是我意识到,如果我返回到第1页并重新调用第2页,问题就会出现:现在我从异步调用中获得了一个新的工作线程,而旧的工作线程没有终止。因此,两个工作线程之间存在争用,这会给我的应用程序带来问题
我无法直接控制线程,因为它们是由异步方法隐式创建的


因此,在这种情况下,是否有人对如何处理该问题提出了建议,或者是否存在处理该问题的通用模式?

这取决于您发出异步请求的方式。如果您使用say,
WebClient
执行类似于
DownloadStringAsync
的操作,您将看到
WebClient
实例有一个方法
CancelAsync
,该方法将
已完成的
事件处理程序中的cancelled属性设置为
true
。离开页面时只需调用
CancelAsync
,并在处理程序中对此进行测试,您应该会做得很好

// in some button handler or whereever
webClient.DownloadStringAsync("http://url.com")

void OnLeavePage(object sender, EventArgs e) {
  webClient.CancelAsync();
}

void OnCompleted(object sender, DownloadStringCompletedEventArgs e) {
  if (e.Cancelled) {
    return;
  }

  // do your handling
}

如果没有
CancelAsync
,则可以传入一个
UserState
对象,该对象具有一个
Cancelled
属性来模拟行为(离开并在处理程序中测试时将其设置为true)

这取决于您发出异步请求的方式。如果您使用say,
WebClient
执行类似于
DownloadStringAsync
的操作,您将看到
WebClient
实例有一个方法
CancelAsync
,该方法将
已完成的
事件处理程序中的cancelled属性设置为
true
。离开页面时只需调用
CancelAsync
,并在处理程序中对此进行测试,您应该会做得很好

// in some button handler or whereever
webClient.DownloadStringAsync("http://url.com")

void OnLeavePage(object sender, EventArgs e) {
  webClient.CancelAsync();
}

void OnCompleted(object sender, DownloadStringCompletedEventArgs e) {
  if (e.Cancelled) {
    return;
  }

  // do your handling
}

如果没有
CancelAsync
,则可以传入一个
UserState
对象,该对象具有一个
Cancelled
属性来模拟行为(离开并在处理程序中测试时将其设置为true)

错误是什么,显示一些代码请有多种类型的异步调用,但它们往往是成对的,“开始”类型调用和“结束”调用,常见的模式是结束调用接收IAsyncResult对象。错误是什么,显示一些代码请有多种类型的异步调用,但它们往往是成对的“开始”键入call和“end”调用,常见的模式是end调用接收一个IAsyncResult对象。