gpt4 book ai didi

c# - 结果导致任务死锁

转载 作者:行者123 更新时间:2023-12-03 13:17:30 25 4
gpt4 key购买 nike

我具有以下构造:一个基类,它异步执行一些加载任务;一个继承的类,它仅将基类的结果转换为特殊的数据类型(它是具有某些扩展名的通用版本,但不是的重要性)。

我最初将继承的类称为Process-method:

    public TOut Process(object parameters)
{
return (TOut) StartProcessor(parameters).Result;
}

该方法调用基础的以下方法:
    protected async Task<object> StartProcessor(object parameters)
{
if (State == PipelineState.Running) return null;
if (!ValidatePipeline())
{
Logging.Error(
"Pipeline can't start processor: There are some broken segment chain-links. Check your segment settings.");
return null;
}

State = PipelineState.Running;
_stopwatch.Start();

object result = await Task.Run(() => RunPipeline(parameters));

_stopwatch.Stop();

if (result is PipelineState)
State = (PipelineState) result;
State = result != null ? PipelineState.Finished : PipelineState.Failed;

RecentProcessTime = _stopwatch.Elapsed;
_stopwatch.Reset();
Logging.Debug("Finished process for pipeline {0} in: {1} ms.", Identifier,
RecentProcessTime.TotalMilliseconds);

return result;
}

private object RunPipeline(object parameter)
{
object recentResult = null;
for (int i = 0; i < SegmentCount; i++)
{
if (_cancelProcess) // Cancel process
return PipelineState.Cancelled;

PipelineSegmentBase seg = Segments[i];
if (i == 0) // If first, do initial process
{
recentResult = seg.Process(parameter, ProcessingDirection);
continue;
}
if (i > 0 && recentResult == null) // If not first and recent result was null, process failed
return PipelineState.Failed;

seg.Process(recentResult, ProcessingDirection); // Process
}

return recentResult ?? PipelineState.Failed;
}

现在,由于Result-property,现在当然继承了类的Process-method死锁。但是,我该如何避免这种情况呢?我看到了很多有关无效方法的文章。但是我得到了一些必须返回主讲课的东西。我必须在处理方法中返回任务吗?我该怎么办,以使其异步运行,同时仍在最后返回对象?

我真的不明白...用void方法很简单,但是由于我需要获取此任务的结果,所以它陷入了僵局。我不知道这应该怎么工作:-/

编辑:这显然发生了...
    public override object Process(object input, PipelineDirection direction)
{
if (!IsValidInput(input)) return null;
Stream str = (Stream) input;
// DEADLOCK
return Core.IDE.GetGUICore().GetUIDispatcher().Invoke(() =>
{
Image i = new Image();
i.BeginInit();
i.Source = BitmapFrame.Create(str);
i.EndInit();
return i;
});
}

谢谢

最佳答案

Must I return a Task in the Process-method?



那是最好的解决方案,是的:
public Task<TOut> ProcessAsync(object parameters)
{
return StartProcessorAsync(parameters);
}

What can I do so that this runs asynchronously whilst it still returns the object at the end?



这两个语句在一起没有意义。想一想。您希望它异步运行,但又同步返回结果。

最好的解决方案是允许代码异步。如果 StartProcessorAsync是异步的,那么调用它的所有内容也应该是异步的。这是编写异步代码的自然方法。

有各种各样的方法可以尝试使 synchronous over asynchronous正常工作,但是它们都不在所有情况下都可以工作-因为以某种方式,这些方法中的每一个都必须尝试强制异步工作同步完成。那只是行不通;最好的解决方案是允许异步工作是异步的。

关于c# - 结果导致任务死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23371505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com