gpt4 book ai didi

c# - Outlook:使用新扩展名保存 TFS-PBI 会锁定 PBI

转载 作者:行者123 更新时间:2023-11-30 17:51:31 28 4
gpt4 key购买 nike

我正在尝试在 Outlook 中创建一个新按钮,它会查找任务 ID、获取连接的 PBI 并将邮件项添加为附件。

很简单:

public void mnuAttachToPBI_Clicked(Office.IRibbonControl control)
{

Microsoft.Office.Interop.Outlook.Selection sel = Global.CurrentApplication.ActiveExplorer().Selection;

if (sel != null && sel.Count > 0)
{
string subj;
foreach (MailItem mailItem in sel)
{
subj = mailItem.Subject.Substring(mailItem.Subject.IndexOf('['));
subj = subj.Substring(0, subj.IndexOf(']'));
subj = subj.Replace("[", String.Empty);
subj = subj.Replace("]", string.Empty);
int taskId;
if (Int32.TryParse(subj, out taskId))
{
WorkItem wi = TfsHandler.GetPbi(taskId);
if (wi != null)
{
string fileName = Path.GetInvalidFileNameChars().Aggregate(mailItem.Subject + ".msg", (current, c) => current.Replace(c.ToString(), "_"));
string path = Path.Combine(Path.GetTempPath(), fileName);

mailItem.SaveAs(path, OlSaveAsType.olMSG);
wi.Attachments.Add(new Microsoft.TeamFoundation.WorkItemTracking.Client.Attachment(path));
wi.Save();
wi.Close();
File.Delete(path);
}
}
}
}
}

静态 TFS 处理程序类如下所示:

private static List<WorkItem> _allWorkItems;

private const string ITEM_TYPE_NAME_PBI = "PBI";
private const string ITEM_TYPE_NAME_TASK = "Task";

private static List<WorkItem> AllWorkItems
{
get
{
if (_allWorkItems == null)
{
WorkItemCollection wc = new WorkItemStore(TFS_SRV).Query(
" SELECT [System.Id], [System.WorkItemType]," +
" [System.State], [System.AssignedTo], [System.Title] " +
" FROM WorkItems");

_allWorkItems = new List<WorkItem>();
foreach (WorkItem w in wc)
_allWorkItems.Add(w);
}

return _allWorkItems;
}
}

/// <summary>
/// Gets the PBI, if the workitem is a task id, it checks parents
/// </summary>
/// <param name="workItemId"></param>
/// <returns></returns>
public static WorkItem GetPbi(int workItemId)
{
WorkItem result = AllWorkItems.FirstOrDefault(f => f.Id == workItemId);

if (result.Type.Name == ITEM_TYPE_NAME_TASK)
{
result = AllWorkItems.FirstOrDefault(f => f.Id == result.WorkItemLinks[0].TargetId);
}

return result;
}

工作正常:我检查,如果邮件项目标题中有 [ID],则获取任务,如果是任务,我获取 PBI,将邮件另存为附件并添加。

但是如果我尝试从 outlook 打开 PBI,我会得到:


团队基础错误

跨线程操作无效:控件“”从创建它的线程以外的线程访问。

确定

因为我要关闭并保存工作项,也就是 PBI,所以我真的希望它能处理这样的事情。

我没有找到解决这个问题的好方法,而且由于我是初学者,所以我没有自己的知识来解决这个问题。

我的网站有错误还是我的方法根本不可能?

最佳答案

你将不得不做一些线程工作。当您在 Outlook 中单击该按钮时,Outlook 会生成一个新线程,该线程试图访问位于单独线程(您首次调用该属性时创建的线程)上的已兑现工作项目。

您可能需要创建自己的拥有数据的后台线程上下文。然后,当单击按钮时,您可以将上下文编码到同一线程上下文以执行并将数据传回。

这很痛苦,但这就是 Outlook 开发......

关于c# - Outlook:使用新扩展名保存 TFS-PBI 会锁定 PBI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19293076/

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