Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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#_.net_Multithreading_Asynchronous_Uwp - Fatal编程技术网

C# 为什么可以';这不是最后一次约会吗?

C# 为什么可以';这不是最后一次约会吗?,c#,.net,multithreading,asynchronous,uwp,C#,.net,Multithreading,Asynchronous,Uwp,问题已经解决了。谢谢 tl;dr version:我正在尝试根据同步进行异步运行,但它处于冻结状态 我有 BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); 这很好用 我需要将其更改为非异步,因此我尝试将其更改为中提到的: 其中: BitmapDecoder SyncDecoder(IAsyncOperation<BitmapDecoder> async) { return Task.Run(() =&

问题已经解决了。谢谢


tl;dr version:我正在尝试根据同步进行异步运行,但它处于冻结状态

我有

BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
这很好用

我需要将其更改为非异步,因此我尝试将其更改为中提到的:

其中:

BitmapDecoder SyncDecoder(IAsyncOperation<BitmapDecoder> async) { return Task.Run(() => async.AsTask()).Result; }
BitmapDecoder-SyncDecoder(IAsyncOperation-async){return Task.Run(()=>async.AsTask()).Result;}
或者更长的(我认为相当于)版本:

位图解码器同步解码器(IAsyncOperation异步)
{
Func asLambda=()=>async.AsTask();
Task asTask=Task.Run(asLambda);
asTask.Wait();//冻结
返回asTask.Result;
}
但是,
SyncDecoder
永远不会返回。(在第二个版本中,它在
Wait()
上冻结)

我尝试为
IReadOnlyList
(和
storageFolder.getfileasync()
)使用相同的方法,但效果很好。所以它在这里也应该起作用。但事实并非如此


我知道UI线程通常不应该被阻塞,但我们需要修复现有代码。不承担大型重构项目。那么如何将代码转换为同步的呢

在您链接到的答案中,启动异步操作的方法被包装在
Task.Run()
调用中。在您的示例中,您已经调用了
CreateAsync
,并将该调用的结果最终传递到一个
Task.Run()
@Damien\u不信者我是这样尝试的:
公共静态位图解码器同步解码器(IAsyncOperation async){return Task.Run(()=>async.AsTask()).result;}
这与链接中的内容完全相同。它也会结冰。此外,它不应该冻结。它应该快速通过
Wait()
。不,它与链接不完全一样。在链接中,启动异步操作的操作称为
asynchmethod
。在您的示例中,等效的方法称为
CreateAsync
。如果您没有将该方法调用放在
任务.Run()
中,则它们在任何方面都不是等价的
AsTask
接受一个已经在进行的异步操作,只是更改该正在进行的操作的表示形式。即使您确实认为已经得到了答案,也不清楚您在问什么。您说要同步运行该操作。但是你说你已经知道你不应该阻止UI线程(这意味着你不想)。你知道同步这个词在这里的意思吗?这意味着您必须阻止进行调用的线程。避免阻塞UI线程的唯一方法是以某种方式异步执行该操作,或者更改问题的上下文,以便所涉及的任何代码都不会在UI中执行。阻塞UI线程会导致死锁。如果要阻止UI线程,那么还需要引起死锁。你的代码死锁了。那么,有什么问题?在我看来,代码正在做你想要它做的事情。事实是,虽然您说“不阻塞已经制造了很多麻烦”,但实际上异步运行东西从长远来看比死锁UI线程带来的麻烦要少得多。这里的答案不是死锁UI线程,而是学习如何正确处理异步代码,这样它就不会“制造太多麻烦”。在您链接到的答案中,启动异步操作的方法被包装在
Task.Run()
调用中。在您的示例中,您已经调用了
CreateAsync
,并将该调用的结果最终传递到一个
Task.Run()
@Damien\u不信者我是这样尝试的:
公共静态位图解码器同步解码器(IAsyncOperation async){return Task.Run(()=>async.AsTask()).result;}
这与链接中的内容完全相同。它也会结冰。此外,它不应该冻结。它应该快速通过
Wait()
。不,它与链接不完全一样。在链接中,启动异步操作的操作称为
asynchmethod
。在您的示例中,等效的方法称为
CreateAsync
。如果您没有将该方法调用放在
任务.Run()
中,则它们在任何方面都不是等价的
AsTask
接受一个已经在进行的异步操作,只是更改该正在进行的操作的表示形式。即使您确实认为已经得到了答案,也不清楚您在问什么。您说要同步运行该操作。但是你说你已经知道你不应该阻止UI线程(这意味着你不想)。你知道同步这个词在这里的意思吗?这意味着您必须阻止进行调用的线程。避免阻塞UI线程的唯一方法是以某种方式异步执行该操作,或者更改问题的上下文,以便所涉及的任何代码都不会在UI中执行。阻塞UI线程会导致死锁。如果要阻止UI线程,那么还需要引起死锁。你的代码死锁了。那么,有什么问题?在我看来,代码正在做你想要它做的事情。事实是,虽然您说“不阻塞已经制造了很多麻烦”,但实际上异步运行东西从长远来看比死锁UI线程带来的麻烦要少得多。这里的答案不是死锁UI线程,而是学习如何正确处理异步代码,这样就不会“制造太多麻烦”。
BitmapDecoder SyncDecoder(IAsyncOperation<BitmapDecoder> async) { return Task.Run(() => async.AsTask()).Result; }
BitmapDecoder SyncDecoder(IAsyncOperation<BitmapDecoder> async)
{
    Func<Task<BitmapDecoder>> asLambda = () => async.AsTask();
    Task<BitmapDecoder> asTask = Task.Run(asLambda);
    asTask.Wait(); // freezes            
    return asTask.Result;
}