none
异步中的这种情况会不会产生泄漏? RRS feed

  • 问题

  • BlankPage::BlankPage()
    {
    	InitializeComponent();
    	_mainPageDispatcher = CoreWindow::GetForCurrentThread()->Dispatcher;
    	Context = ref new TextContext;
    	DataContext = Context;
    	AsyncOper=TestWithProgressAsync(100);  //连续的异步函数调用会不会产生资源泄漏?
    	AsyncOper=TestWithProgressAsync(1001);
        AsyncOper->Completed=ref new AsyncOperationWithProgressCompletedHandler<TextContext^,String^>(
            [this](IAsyncOperationWithProgress<TextContext^,String^>^ pretask, AsyncStatus asyncStatus){
                if(asyncStatus==AsyncStatus::Completed)
                {
                    TextContext^ res=pretask->GetResults();
    		safe_cast<TextBlock^>(this->FindName("result"))->Text+=res->res.ToString();
                }
                if(asyncStatus==AsyncStatus::Canceled)
                {
                    safe_cast<TextBlock^>(this->FindName("result"))->Text="Cancel";
    				this->Context->text = "Cancel";
                }
                if(asyncStatus==AsyncStatus::Error)
                {
                    try
                    {
                        TextContext^ res=pretask->GetResults();
    
                    }catch(Exception^ ex)
                    {
                        safe_cast<TextBlock^>(this->FindName("result"))->Text+=ref new String(ex->Message->Data());
                    }
                }
        });
    
    }
    
    IAsyncOperationWithProgress<TextContext^,String^>^ BlankPage::TestWithProgressAsync(int input)
    {
    
        return create_async([this,input](progress_reporter<String^> reporter)->TextContext^ {
            if(input==0)
                 throw ref new InvalidArgumentException();
            bool moreToDo = true;
    		int a = input;
    		TextContext^ asytext = ref new TextContext;
    		while (moreToDo)
            {
    		
                // Check for cancellation.
                if (is_task_cancellation_requested()) {                
                    // Cancel the current task.
                    cancel_current_task();
                    return nullptr;
                    moreToDo = false;
    				//this->Context->text = "error";
                }
                else {
                    // Perform work.
    				asytext->text = "Run\n";
    				asytext->res = a;
    				a++;
    				//reporter.report();
    				String^ str = "Run\n";
    				if(a == 110)
    					moreToDo=false;
                }
            }
            return asytext;
    	});
    }
    AsyncOper=TestWithProgressAsync(100);  //连续的异步函数调用会不会产生资源泄漏?
    AsyncOper=TestWithProgressAsync(1001);
    这样通过调试发现第一个异步函数就不会执行了,如果没有去取消第一个异步函数运行一半又开始了第2次响应,这样会产生资源泄漏吗??



    • 已编辑 WillSu 2012年5月16日 11:01
    2012年5月16日 10:55

答案

  • 不会,之前那个异步他也会继续执行,你在Visual Studio 11的 Parallel 的监视并行的任务和线程:

    在Parallel Stacks中你可以看到很多的线程以及其调用栈, 你应该可以找到你的这个第一次的AsyncOper创建的那个,然后你可以跟踪下。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月18日 9:27
    版主